在 .NET IL 中,将接口的属性和事件直接实现为方法是否可以接受?
In .NET IL is it acceptable to implement an interface's properties and events directly as methods?
在我的反射 C# 代码中,我迭代接口上的方法并发出 class a) 被声明为实现接口 b) 实现了 GetMethods()
returns.
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_)。
动态创建的 class 被 CLR 接受为接口的实现并且调用对象的属性和事件(转换为接口)工作正常。但是在类型生成器中有 DefineProperty
和 DefineMethod
。如果仅使用 DefineMethod
,我可以使用 ildasm 确认声明中缺少“.属性”。将接口的属性和事件实现为 'just' 方法是不是很顽皮?或者这是完全合法的?
Is it naughty to implement an interface's properties and events as if
they were 'just' methods?
是的,是的。您将无法将属性用作属性(使用 dynamic
时)。
在我的反射 C# 代码中,我迭代接口上的方法并发出 class a) 被声明为实现接口 b) 实现了 GetMethods()
returns.
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_)。
动态创建的 class 被 CLR 接受为接口的实现并且调用对象的属性和事件(转换为接口)工作正常。但是在类型生成器中有 DefineProperty
和 DefineMethod
。如果仅使用 DefineMethod
,我可以使用 ildasm 确认声明中缺少“.属性”。将接口的属性和事件实现为 'just' 方法是不是很顽皮?或者这是完全合法的?
Is it naughty to implement an interface's properties and events as if they were 'just' methods?
是的,是的。您将无法将属性用作属性(使用 dynamic
时)。