创建实现接口的匿名类

本文关键字:实现 接口 创建 | 更新日期: 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);