如何获取实现接口的所有类的属性值?

时间:2018-03-15 14:47:01

标签: c# reflection

我有以下架构:

public interface IStatus
{
    string StatusName {get;}
}
public class A: IStatus
{
    public string StatusName {get {return "A Status";}}
}

public class B: IStatus
{
    public string StatusName {get {return "B Status";}}
}

public class C: IStatus
{
    public string StatusName {get {return "C Status";}}
}

我尝试了以下内容,我可以在调试中看到所有相关的类,但我不知道如何获取每个类的StatusName属性。 我认为,我需要以某种方式创建每个类的实例并请求StatusName属性。

public class Test
{
    var type = typeof(IStatus);
    var types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => type.IsAssignableFrom(p));

        foreach (Type mytype in types)
        {
            var i = mytype.GetMember("StatusName");
            if (i.Count()!=0)
            {
                var n = i.GetValue(0);
            }               
        }
}

我需要的预期结果是带有值的字符串列表:     “A状态”,“B状态”,“C状态”

2 个答案:

答案 0 :(得分:1)

根据评论,听起来状态是每种类型和不变的状态,可能需要独立于任何实例。这使得它们成为接口的不良选择,并且非常适合“属性”:

using System;
using System.Linq;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
sealed class StatusAttribute : Attribute
{
    public StatusAttribute(string name) { Name = name; }
    public string Name { get; }
}
[Status("A Status")]
public class A
{ /* ... */  }

[Status("B Status")]
public class B
{ /* ... */  }

[Status("C Status")]
public class C
{ /* ... */  }

static class P
{
    static void Main()
    {
        var attrib = typeof(StatusAttribute);
        var pairs = from s in AppDomain.CurrentDomain.GetAssemblies()
                    from p in s.GetTypes()
                    where p.IsDefined(attrib, false)
                    select new
                    {
                        Type = p,
                        Status = ((StatusAttribute)Attribute.GetCustomAttribute(
                                  p, attrib)).Name
                    };

        foreach(var pair in pairs)
        {
            Console.WriteLine($"{pair.Type.Name}: {pair.Status}");
        }
    }

}

答案 1 :(得分:0)

您可以为每个类型创建默认实例,然后获取每个属性的值,因为它们只有 var instance = Activator.CreateInstance(myType); var value = instance.GetType().GetProperty("StatusName").GetValue(instance); ,这应该不是问题

var reviewData = "@ReviewData.Serialize()"