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

时间:2015-07-27 14:51:14

标签: c#

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

//classA:

int id;
string name;
classB subItem;

//classB:

int randomNumber;
string answerOfLife;

我写了这个函数,搜索classA的所有属性,找到属性为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对象。

2 个答案:

答案 0 :(得分:3)

我已更新了使用泛型的答案,请参阅我之前使用的isas以及之前使用过的BaseDataObject

使用Generics。它将使这种逻辑更加灵活和可重用:

我们需要在您的内部方法中将所有对T的调用替换为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); } } ,因此我修改了FindPropertyByType:

default(T)

B tempObject = a.FindPropertyType<B>("B"); 将返回T类型的默认值,在您的情况下为空。

现在,无论何时需要此方法,您都可以指定所需的类型,如下所示:

var myId = a.FindPropertyType<int>("id");

另外,这也应该有效:

is

以下答案

如果我正确阅读了您的问题,您可以使用if( someProperty is classB) //do something else //do something different 关键字(MSDN Doc

as

或者你可以使用private classB getPropAsClassB(someProperty) { return someProperty as classB; } var myProp = getPropAsClassB(someProp); //will be null if it isn't a classB object 关键字(MSDN doc),如果对象是你正在投射的对象,它将返回null:

 <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>Server-Side Scripting Languages<li>ASP</li><li>ASP.NET </li><li>ASP.NET MVC</li><li>Hack</li><li>JavaScript</li><li>Java</li><li>PHP</li><li>Python</li><li>Ruby</li></ul>
                     </div>
                     <div class="clearfix visible-xs"></div>
                    <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>Client-Side Scripting Languages<li>JavaScript</li><li>ActionScript</li><li>Dart</li><li>VBScript</li><li>Typescript</li><li>Python</li></ul>
                    </div>
<div class="clearfix visible-sm"></div>
                    <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>PHP Frameworks<li>Cake PHP</li><li>Laravel</li><li>JOOMLA</li><li>Fuel PHP</li><li>Yii</li><li>Code Igniter</li><li>Zend Framework</li></ul>
                    </div>
<div class="clearfix visible-xs"></div>
                    <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>Javascript Frameworks<li>Angular JS</li><li>Dojo</li><li>Ext JS</li><li>Ember JS</li><li>jQuery</li><li>Kendo UI</li><li>Backbone JS</li><li>Underscore JS</li></ul>
                    </div>
                    <div class="clearfix"></div>
                    <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>Mobile App Development<li>Android</li><li>iOS</li><li>Windows</li><li>Blackberry</li><li>FireFox</li><li>SailFish</li><li>Ubuntu</li></ul>
                    </div>
<div class="clearfix visible-xs"></div>
                    <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>Database<li>MySql</li><li>Mongo DB</li><li>RDS</li><li>Redis</li><li>Dynamo</li><li>Cassandra</li></ul>
                    </div>
<div class="clearfix visible-sm"></div>
                    <div class="col-md-3 col-lg-3 col-sm-6 col-xs-12">
                        <ul>CSS Frame-works<li>Bootstrap</li><li>Pure CSS</li><li>Unsemanitc</li><li>960 Grid system</li><li>Cascade Framework</li><li>Foundation</li></ul>
                    </div> 

答案 1 :(得分:1)

假设您有对象列表:

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异常......