像这样:
public class remoteStatusCounts : RemoteStatus
{
public int statusCount;
public remoteStatusCounts(RemoteStatus r)
{
Type t = r.GetType();
foreach (PropertyInfo p in t.GetProperties())
{
this.property(p) = p.GetValue(); //example pseudocode
}
}
}
示例有点简单(它来自Jira API - RemoteStatus有4个属性),但想象一下基类有30个属性。我不想手动设置所有这些值,特别是如果我的继承类只有一些额外的属性。
反思似乎暗示了答案。
我在Using inheritance in constructor (publix X () : y)看到我可以调用基类构造函数(我想?如果我错了,请纠正我),但是我的基类没有构造函数 - 它来自jira wsdl < / p>
public remoteStatusCounts(RemoteStatus r) : base(r) { //do stuff }
修改
我可以想象两个有效的解决方案:上面列出的一个,以及this.baseClass
之类的关键字type(baseclass)
并且被操纵,作为一种指向this
的指针。因此,this.baseClass.name = "Johnny"
与this.name = "Johnny"
对于所有意图和目的,让我们假设基类有一个复制构造函数 - 也就是说,这是有效的代码:
public remoteStatusCounts(RemoteStatus r) {
RemoteStatus mBase = r;
//do work
}
EDIT2 这个问题更像是一个思想练习,而不是一个实际的问题 - 为了我的目的,我可以轻松地做到这一点:(假设我的“基类”可以复制)
public class remoteStatusCounts
{
public int statusCount;
public RemoteStatus rStatus;
public remoteStatusCounts(RemoteStatus r)
{
rStatus = r;
statusCount = getStatusCount();
}
}
答案 0 :(得分:2)
尝试AutoMapper。
答案 1 :(得分:1)
是的,你可以做到这一点 - 但要注意,你可能会碰到你必须单独处理的只有getter的属性。
您可以使用Type.GetProperties(BindingsFlags)
重载来过滤它。
注意:您可能应该研究代码生成(T4将是一个想法,因为它与vs 2008/2010一起提供),因为反射可能具有运行时影响,如执行速度。使用代码生成,您可以轻松处理这项繁琐的工作,并且仍然具有相同的运行时间等,例如手动输入。
示例:
//extension method somewhere
public static T Cast<T>(this object o)
{
return (T)o;
}
public remoteStatusCounts(RemoteStatus r)
{
Type typeR = r.GetType();
Type typeThis = this.GetType();
foreach (PropertyInfo p in typeR.GetProperties())
{
PropertyInfo thisProperty = typeThis.GetProperty(p.Name);
MethodInfo castMethod = typeof(ExMethods).GetMethod("Cast").MakeGenericMethod(p.PropertyType);
var castedObject = castMethod.Invoke(null, new object[] { p.GetValue(r, null) });
thisProperty.SetValue(this, castedObject, null);
}
}