创建实现接口的匿名类

我想知道是否有一些内联的简短方法来创建一个实现接口的类。 就像有匿名方法但有实现接口。

问题是:

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);