在.NET IL中,可以将接口的属性和事件直接实现为方法吗?

2sbarzqh  于 2023-10-21  发布在  .NET
关注(0)|答案(2)|浏览(127)

在我的反射C#代码中,我覆盖了接口上的方法,并发出了一个类,a)声明为实现接口B)实现了GetMethods()返回的所有方法。

var methods = typeof(T).GetMethods(); // T is interface
foreach (var methodInfo in methods)
{
    var parameters = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray();
    var method = typeBuilder.DefineMethod(
        methodInfo.Name,
        MethodAttributes.Public | MethodAttributes.Virtual,
        methodInfo.ReturnType,
        parameters);
        ... // Emit IL

这不仅创建了方法,还创建了作为方法对的属性和事件(get_ set_ / add_ remove_)。
动态创建的类作为接口的实现被EJB接受,并且调用对象的属性和事件(强制转换为接口)工作正常。然而,在类型生成器中有DefinePropertyDefineMethod。使用ildasm,我可以确认如果只使用DefineMethod,声明中缺少“.property”。把接口的属性和事件当作“仅仅”方法来实现是不是有点淘气?或者这是完全合法的吗?

mf98qq94

mf98qq941#

把接口的属性和事件当作“仅仅”方法来实现是不是有点淘气?
是的,它是。你将不能使用属性作为属性(当使用dynamic时)。

svdrlsy4

svdrlsy42#

这很淘气,你不会想这么做的。
如果这样做,从调用对象的其他代码的Angular 来看,对象可能是好的,但从反射的Angular 来看,它们将是不完整的。因此,在任何需要适当反射信息的情况下,对象都不会正确工作。
正如另一个答案所述,Dynamic就是这种情况的一个例子。

我不在乎DynamicDynamic是:

  • 一个解决糟糕设计的方法,
  • 它的使用导致了相当糟糕的设计。

我知道Dynamic现在几乎是每个人的宠儿。这是因为现在几乎每个人都是一个剧本的孩子。

但这里有一个更糟糕的问题:
如果您尝试在Visual Studio调试器的“Locals”或“Autos”窗口中查看对象,则生成的属性将不会出现!Visual Studio调试器枚举对象的属性,以决定在那里显示什么,因此如果对象没有正确定义其属性,则不会显示这些属性。
我只是在自己的东西上遇到了这个问题,并写了一个关于它的问题和答案:
Emitted properties do not appear in the debugger

相关问题