【发布时间】:2013-07-30 03:19:49
【问题描述】:
我的 CTO(首席技术官)要求我想出一种方法,让他可以在基类中编写一个函数,并可以访问子类的所有属性。这是我想出的 -
基类
class Assets
{
public Assets getPropertyVal(Assets asObj)
{
PropertyInfo[] propInfos = asObj.GetType().GetProperties();
string strAttributeValue = "10";
foreach (PropertyInfo propInfo in propInfos)
{
// Getting the value
var propValue = propInfo.GetValue(asObj, null);
// Setting the value
propInfo.SetValue(asObj, Convert.ChangeType(strAttributeValue, propInfo.PropertyType), null);
}
return asObj;
}
}
儿童班
class House : Assets
{
public int rooms{get; set;}
}
Program.cs 文件
class Program
{
static void Main(string[] args)
{
House hsObj = new House();
hsObj.rooms = 5;
Assets asObj = hsObj.getPropertyVal(hsObj);
// Returns asObj as JSON
}
}
现在这工作正常,但我只是想知道在 C# 中是否有更好的方法来做到这一点。
请注意,我们不知道子类中将存在哪些属性,因此必须在运行时确定。
更新:说清楚,我只是想知道是否有更好的方法来访问子类属性,一种不使用反射的方法。需要注意的重要一点是,我们不知道子类可能具有哪些属性。
更新 #2 :我正在使用具有许多实体的产品。这些实体具有不同的属性。我希望能够在一个地方访问和使用所有这些属性。这个功能正是如此。这是我可以访问所有数据的一个地方。
【问题讨论】:
-
在您的示例中,您创建一个对象并获取该对象的所有属性,然后在该对象中设置相同的属性。它看起来像这样:
var propValue = asObj.rooms; asObj.rooms = (int) propValue;。你到底想要什么?要将所有属性从子类复制到基类吗? -
@VyacheslavVolkov,我只是想知道是否有更好的方法来访问子类属性而不使用反射。
-
我不明白这样做的目的。在您的示例中,您使用
Console.WriteLine(hsObj.rooms);对子属性名称进行硬编码。您也可以完全摆脱hsObj = (House)hsObj.getPropertyVal(hsObj);行。反射完全浪费了。你能想出一个更好的例子来说明你想要完成的事情吗?
标签: c# .net inheritance class-design multiple-inheritance