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;//代码的其余部分}