我有以下课程:

[Msg(Value = "YaaY")]
public class PersonContainer<T>  where T : new()
{
   ...
}


public class HappyPerson
{
   ...
}

[Msg(Value = "NaaY")]
public class SadPerson
{
   ...
}


使用以下方法,我可以获取“ PersonContainer”的属性:

public void GetMsgVals(object personContainer)
{
    var info = personContainer.GetType();

    var attributes = (MsgAttribute[])info.GetCustomAttributes(typeof(MsgAttribute), false);
    var vals= attributes.Select(a => a.Value).ToArray();        
}


但是,我仅获得“ PersonContainer”(即“ YaaY”)的属性,如何在运行时获取T (HappyPerson [if any] or SadPerson["NaaY"])的属性而又不知道T是什么?

最佳答案

您需要获取通用参数的类型,然后是属性:

var info = personContainer.GetType();

if (info.IsGenericType)
{
     var attributes = (MsgAttribute[])info.GetGenericArguments()[0]
                      .GetCustomAttributes(typeof(MsgAttribute), false);
}


编辑:GetGenericArguments返回一个Type数组,因此我对GetType的第一次调用是不必要的,因此将其删除。

10-02 02:27