创建实现接口的匿名类
我想知道是否有一些内联的简短方法来创建一个实现接口的类。 就像有匿名方法但有实现接口。
问题是:
interface iSomeInterface { void DoIt(); } public void myMethod(iSomeInterface param) { ... }
我想像这样使用它:
object.myMethod(new { override DoIt() { Console.WriteLine("yay"); } } : iSomeInterface);
有任何想法吗?
对不起,如果它重复。
对不起,没有在C#中内联实现类。 只有匿名类型 ,但它们不支持添加接口(例如,参见C#匿名类可以实现接口吗? )(它们也不支持添加方法或字段……它们仅支持属性)。
您可以使用System.Reflection.Emit
的方法在运行时生成一个类,但它很冗长乏味。
您可以创建一个包装Action
并实现该接口的类:
public sealed class SomeAction : ISomeInterface { Action action; public SomeAction (Action action) { this.action = action; } public void DoIt() { this.action(); } }
这允许您按如下方式使用它:
object.myMethod(new SomeAction(() => Console.WriteLine("yay"));
如果您要重用SomeAction
,这当然是非常实用的,但这可能是最方便的解决方案。
这在java中很常见,但是你无法在C#中做到这一点。 您可以将函数或过程作为参数传递:
public void myMethod(Action act) { act(); } myMethod( () => Console.WriteLine("yay") );
存在几个(通用)版本的Action(具有参数且没有返回值的过程)和Func(具有参数和返回值的函数)。
寻找“ImpromptuInterface”NuGet包。 通过这个包和ExpandoObject的组合,你可以做这样的事情
//Create an expando object and create & assign values to all the fields that exists in your interface dynamic sigObj = new ExpandoObject(); sigObj.EmployeeKey = 1234; //Create the object using "ActLike" method of the Impromptu class INewSignatureAcquired sig = Impromptu.ActLike(sigObj);