创建实现接口的匿名类
本文关键字:实现 接口 创建 | 更新日期: 2023-09-27 18:30:27
我想知道是否有一些内联的简短方法来创建实现接口的类。就像有匿名方法一样,但具有实现接口。
问题是:
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<INewSignatureAcquired>(sigObj);