在我的反射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接受,并且调用对象的属性和事件(强制转换为接口)工作正常。然而,在类型生成器中有DefineProperty
和DefineMethod
。使用ildasm,我可以确认如果只使用DefineMethod
,声明中缺少“.property”。把接口的属性和事件当作“仅仅”方法来实现是不是有点淘气?或者这是完全合法的吗?
2条答案
按热度按时间mf98qq941#
把接口的属性和事件当作“仅仅”方法来实现是不是有点淘气?
是的,它是。你将不能使用属性作为属性(当使用
dynamic
时)。svdrlsy42#
这很淘气,你不会想这么做的。
如果这样做,从调用对象的其他代码的Angular 来看,对象可能是好的,但从反射的Angular 来看,它们将是不完整的。因此,在任何需要适当反射信息的情况下,对象都不会正确工作。
正如另一个答案所述,
Dynamic
就是这种情况的一个例子。我不在乎
Dynamic
。Dynamic
是:我知道
Dynamic
现在几乎是每个人的宠儿。这是因为现在几乎每个人都是一个剧本的孩子。但这里有一个更糟糕的问题:
如果您尝试在Visual Studio调试器的“Locals”或“Autos”窗口中查看对象,则生成的属性将不会出现!Visual Studio调试器枚举对象的属性,以决定在那里显示什么,因此如果对象没有正确定义其属性,则不会显示这些属性。
我只是在自己的东西上遇到了这个问题,并写了一个关于它的问题和答案:
Emitted properties do not appear in the debugger