我有以下架构:
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状态”
答案 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()"