查找具有特定类型的属性并返回它
本文关键字:属性 返回 类型 查找 | 更新日期: 2023-09-27 18:04:50
我有一个来自一个类的对象(我们称之为classA
),并且我知道它有一个来自另一个类(classB
)的属性对象。我怎么能找到类型classB
的对象,并返回它(与它的所有值)?
//classA:
int id;
string name;
classB subItem;
//classB:
int randomNumber;
string answerOfLife;
我写了这个函数,它搜索classA
的所有属性,以查找propertyType为classB
的属性。我可以找到属性,但然后我被困在一个PropertyInfo
对象,我真的想要一个classB
对象与所有的值。
classB tempObject = (classB) classAObject.FindPropertyType("classB");
功能:
internal BaseDataObject FindPropertyType(string strMember) {
foreach (PropertyInfo prop in this.GetType().GetProperties())
{
if (prop.PropertyType.Name.ToString().ToLower() == strMember.ToLower())
//This is where it goes wrong!
return (BaseDataObject) prop.GetValue(this,null);
}
return null;
}
prop.GetValue(this,null)
返回父(classA
)对象,而不是期望的classB
对象。
我已经更新了使用泛型的答案,请参阅我之前使用is
和as
的方法,
使用泛型。它将使这个逻辑更加灵活和可重用:
我们需要在内部方法中将所有对BaseDataObject
的调用替换为T
,所以我修改了FindPropertyByType:
public class BaseDataObject
{
internal T FindPropertyType<T>(string strMember)
{
var type = this.GetType();
var props = type.GetProperties();
foreach (PropertyInfo prop in props)
{
if (prop.PropertyType.Name.ToString().ToLower() == strMember.ToLower())
//This is where it goes wrong!
return (T)prop.GetValue(this, null);
}
return default(T);
}
}
default(T)
将返回T类型的默认值,在您的示例中为Null。
现在,当你需要这个方法时,你可以指定你想要的类型,像这样:
B tempObject = a.FindPropertyType<B>("B");
另外,这也应该工作:
var myId = a.FindPropertyType<int>("id");
上一个答案下面
如果我没看错你的问题,你可以使用is
关键字(MSDN Doc)
if( someProperty is classB)
//do something
else
//do something different
或者您可以使用as
关键字(MSDN文档),如果对象是您正在转换的对象,则返回null:
private classB getPropAsClassB(someProperty)
{
return someProperty as classB;
}
var myProp = getPropAsClassB(someProp); //will be null if it isn't a classB object
假设你有一个对象列表:
List<object> objects; // all types of objects here include classA, int, string etc
那么你可以这样做:
classB tempObject = (objects.FirstOrDefault(o => o is classA) as ClassA).subItem;
如果对象不包含ClassA的任何实例,当我们试图访问'subItem'属性时,将抛出Nullreference异常…