C# 反射:获取在参数对象中实现接口的所有属性

C# 反射:获取在参数对象中实现接口的所有属性,c#,reflection,C#,Reflection,我有一个类,它有许多其他类的对象: public class Rootobject { public USD USD { get; set; } public CAD CAD { get; set; } public EUR EUR { get; set; } public AED AED { get; set; } public AFN AFN { get; set; } public ALL ALL { get; set; } } 这些类中的

我有一个类,它有许多其他类的对象:

public class Rootobject
{
    public USD USD { get; set; }
    public CAD CAD { get; set; }
    public EUR EUR { get; set; }
    public AED AED { get; set; }
    public AFN AFN { get; set; }
    public ALL ALL { get; set; }
}
这些类中的每一个都实现了一个名为
ICurrency
的接口;
iccurrency
接口有一个名为“symbol”的字符串属性,如下所示:

public class EUR : ICurrency 
{/*code logic*/}
最后,我有一个方法,它将
RootObject
实例作为参数

public object Add22(Rootobject rootobject)
{}
我需要获取
rootobject
变量中传递的所有实例的“symbol”属性的所有值

我认为这可以很容易地通过反射来实现,方法是创建一个
iccurrency
列表,并添加其中的所有对象,然后在其中循环

我说得对吗?若有,;那怎么做呢?或者有更好的方法?

您可以使用它来获取类型的属性,并确定属性是否可以分配给
iccurrency
变量。可以使用LINQ查询检索所有匹配的属性:

var currencyProps=typeof(Rootobject).GetProperties()                                   
                   .Where(pi=>typeof(ICurrency).IsAssignableFrom(pi.PropertyType))
                   .ToArray();

您可以将
currencyProps
数组缓存在静态字段中,并将其与任何对象一起重用:

static PropertyInfo[] _currencyProps;

static void InitializeCurrencyProps()
{
    var currencyProps=( from pi in typeof(RootObject).GetProperties()                                   
                        where typeof(ICurrency).IsAssignableFrom(pi.PropertyType)
                        select pi);
    _currencyProps=currencyProps.ToArray();
}
获得所需的所有PropertyInfo对象后,可以使用从特定实例读取属性值,例如:

_currencyProps[0].GetValue(rootObject);
要查找具有值的所有属性(即非noll),可以使用另一个查询:

var values=_currencyProps.Select(pi=>new {pi.Name,Value=pi.GetValue(rootobject)})
                        .Where(val=>val.Value!=null)
                        .ToArray();

您可以使用
ToDictionary()
创建字典而不是数组:

您可以使用获取类型的属性,并查找是否可以将属性分配给
iccurrency
变量。可以使用LINQ查询检索所有匹配的属性:

var currencyProps=typeof(Rootobject).GetProperties()                                   
                   .Where(pi=>typeof(ICurrency).IsAssignableFrom(pi.PropertyType))
                   .ToArray();

您可以将
currencyProps
数组缓存在静态字段中,并将其与任何对象一起重用:

static PropertyInfo[] _currencyProps;

static void InitializeCurrencyProps()
{
    var currencyProps=( from pi in typeof(RootObject).GetProperties()                                   
                        where typeof(ICurrency).IsAssignableFrom(pi.PropertyType)
                        select pi);
    _currencyProps=currencyProps.ToArray();
}
获得所需的所有PropertyInfo对象后,可以使用从特定实例读取属性值,例如:

_currencyProps[0].GetValue(rootObject);
要查找具有值的所有属性(即非noll),可以使用另一个查询:

var values=_currencyProps.Select(pi=>new {pi.Name,Value=pi.GetValue(rootobject)})
                        .Where(val=>val.Value!=null)
                        .ToArray();

您可以使用
ToDictionary()
创建字典而不是数组:


非常感谢,;在获得Values数组之后,我使用了这一部分来深入研究所需的属性:foreach(Values中的var x){iccurrency iccurrency=(iccurrency)x.value;//代码的其余部分}非常感谢;在获取Values数组后,我使用了这一部分来深入研究所需的属性:foreach(Values中的var x){ICurrency ICurrency=(ICurrency)x.value;//代码的其余部分}