2

I am wondering if there is some inline short way of creating a class implementing a interface. Just like there are the anonymous methods but with implementing interfaces.

The problem is:

interface iSomeInterface
{
  void DoIt();
}

public void myMethod(iSomeInterface param)
{
 ...
}

And I would like to use it like this:

object.myMethod(new { override DoIt() { Console.WriteLine("yay"); } } : iSomeInterface);

Any ideas?

Sorry in case its a duplicate.

4

4 回答 4

4

抱歉,C# 中没有类的内联实现。只有Anonymous Types,但它们不支持添加接口(例如参见Can a C# anonymous class implement an interface?)(它们也不支持添加方法或字段......它们只支持属性)。

您可以使用 的方法System.Reflection.Emit在运行时生成一个类,但它既冗长又乏味。

于 2013-09-06T10:38:51.433 回答
3

您可以创建一个包装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,但这可能是最方便的解决方案。

于 2013-09-06T11:32:20.007 回答
0

这在 java 中很常见,但在 C# 中无法做到。您可以将函数或过程作为参数传递:

public void myMethod(Action act)
{
    act();
}

myMethod( () => Console.WriteLine("yay") );

存在多个(通用)版本的 Action(有参数但没有返回值的过程)和 Func(有参数和返回值的函数)。

于 2013-09-06T11:15:26.537 回答
0

查找“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);
于 2018-07-13T15:10:48.023 回答