查找具有特定类型的属性并返回它

本文关键字:属性 返回 类型 查找 | 更新日期: 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对象。

查找具有特定类型的属性并返回它

我已经更新了使用泛型的答案,请参阅我之前使用isas的方法,

使用泛型。它将使这个逻辑更加灵活和可重用:

我们需要在内部方法中将所有对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异常…