我有一个类中的对象(让我们称之为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
对象。
答案 0 :(得分:3)
我已更新了使用泛型的答案,请参阅我之前使用的is
和as
以及之前使用过的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异常......