在 .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 接受为接口的实现并且调用对象的属性和事件(转换为接口)工作正常。但是在类型生成器中有 DefinePropertyDefineMethod。如果仅使用 DefineMethod,我可以使用 ildasm 确认声明中缺少“.属性”。将接口的属性和事件实现为 'just' 方法是不是很顽皮?或者这是完全合法的?

Is it naughty to implement an interface's properties and events as if they were 'just' methods?

是的,是的。您将无法将属性用作属性(使用 dynamic 时)。