Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找具有特定类型的属性并返回它_C# - Fatal编程技术网

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

C# 查找具有特定类型的属性并返回它,c#,C#,我有一个类中的对象(我们称之为classA),我知道它有另一个类中的属性对象(classB)。如何找到类型为classB的对象并返回它(及其所有值) 我编写了这个函数,用于搜索classA的所有属性,以找到propertyTypeclassB的属性。我可以找到属性,但是我被一个PropertyInfo对象困住了,我真的想要一个classB对象和所有的值 classB tempObject = (classB) classAObject.FindPropertyType("classB"); 功

我有一个类中的对象(我们称之为
classA
),我知道它有另一个类中的属性对象(
classB
)。如何找到类型为
classB
的对象并返回它(及其所有值)

我编写了这个函数,用于搜索
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);
        }

    }
此外,这也应该起作用:

var myId = a.FindPropertyType<int>("id");
或者您可以将
用作
关键字(),如果对象是您正在铸造的对象,则该关键字将返回null:

private classB getPropAsClassB(someProperty)
{
    return someProperty as classB;
}

var myProp = getPropAsClassB(someProp); //will be null if it isn't a classB object

我已经更新了我的答案,以使用泛型,请参见我以前使用的
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);
        }

    }
此外,这也应该起作用:

var myId = a.FindPropertyType<int>("id");
或者您可以将
用作
关键字(),如果对象是您正在铸造的对象,则该关键字将返回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

如果对象不包含ClassA的任何实例,当我们尝试访问“subItem”属性时,这将引发Nullreference异常…

假设您有对象列表:

List<object> objects; // all types of objects here include classA, int, string etc

如果对象不包含ClassA的任何实例,当我们尝试访问“subItem”属性时,这将引发Nullreference异常…

是否继承
(BaseDataObject)
?@YuvalItzchakov yes,
classA
classB
都继承自absrac类
BaseDataObject
@CodeCaster:我没有得到
classB
对象。我返回了原始的
classA
对象。从描述中看非常不清楚。请给出一个实际的编译示例,并正确解释问题。此代码不会像您声称的那样返回包含类(即
This
),而是返回找到的属性值。您知道您正在查询类型名称并使用成员名称调用它吗?同样,请创建一个正确编译和演示问题的示例。
ClassB
是否继承
(BaseDataObject)
?@YuvalItzchakov是的,
classA
ClassB
都继承自abstrac类
BaseDataObject
@CodeCaster:我没有得到
ClassB
对象。我返回了原始的
classA
对象。从描述中看非常不清楚。请给出一个实际的编译示例,并正确解释问题。此代码不会像您声称的那样返回包含类(即
This
),而是返回找到的属性值。您知道您正在查询类型名称并使用成员名称调用它吗?同样,请创建一个正确编译和演示问题的示例。谢谢,我添加了一些信息。我可以找到正确的对象,但我不能返回它。我需要
classB
中的对象(及其值),我只得到了
PropertyInfo
object atm。谢谢,我添加了一些信息。我可以找到正确的对象,但我不能返回它。我需要
classB
中的对象(及其值),我只得到
PropertyInfo
object atm。