在类型之后命名通用属性

时间:2013-10-30 19:53:10

标签: c# asp.net generics reflection asp.net-web-api

我有一个这样的C#类(为简单起见,删除了额外的属性):

public class MyClass<T>
{
    public T MyProperty { get; set; }
}

是否有可能以MyProperty的类型动态命名T

例如,如果我将我的类实例化为:

MyClass<MyOtherClass> myClass = new MyClass<MyOtherClass>();

我希望MyProperty的名称改为MyOtherClass。我查看过谷歌和StackOverflow,但没有找到这样的东西。这有可能吗?也许使用反射?


修改

首先,如果您打算回答我的问题,如果您愿意评论原因,我将不胜感激。

第二,也许这有助于澄清我为什么要这样做。该类由API返回。它有一些与错误相关的信息,以及表示被返回实体的泛型类型属性。但是,在进行API调用时,响应看起来像这样:

[
  {
    "MyOtherClass": {
      // properties here
    },
    "Errors": [
      {
        "ErrorCode": 1,
        "Message": "sample string 1"
      },
      {
        "ErrorCode": 1,
        "Message": "sample string 1"
      }
    ]
  }
]

我希望上面的“MyOtherClass”是实体的实际名称(泛型)。

1 个答案:

答案 0 :(得分:1)

您可以延长DynamicObject

public class MyClass<T> : DynamicObject
{
    private T property;

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (binder.Name == typeof(T).Name)
        {
            result = property;
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (binder.Name == typeof(T).Name && value is T)
        {
            property = (T)value;
            return true;
        }
        else
        {
            return false;
        }
    }
}
你可以使用

dynamic myObj = new MyClass<string>();
myObj.String = "value";

string value = myObj.String;