假设我有一个现有的方法,它总是返回一个OldClassType类型的变量
//Takes 1 parameter p1
//Returns a variable of type OldClassType, after doing a bunch of logic.
protected OldClassType MyMethod(int32 p1)
{
OldClassType myVar = new OldClassType();
myVar.name = "Hello";
myVar.age = "36";
return myVar;
}
现在,我有一个NewClassType,它具有与OldClassType完全相同的属性,但具有不同的命名空间。我需要转换相同的方法(MyMethod),以便代替ALWAYS返回OldClassType,它应该返回一个类型为OldClassType或NewClassType的变量 - 基于新添加的参数useNewType
类似于:
//Takes 2 parameter: p1 and useNewType - which determines when to use the NewClassType or default to the OldClassType
//Returns a variable of type object, after doing a bunch of logic. I'll modify the Call to this new modified method to cast the object to the appropriate Type (OldClassType/NewClassType)
protected object MyMethod(int32 p1, bool useNewType)
{
object myVar = new object();
myVar.name = "Hello"; // Do I use PropertyInfo and then set value?
myVar.age = "36";
return myVar;
}
编辑: 另外一条信息是将来会从代码中删除OldClassType。因此,我试图找到影响最小的解决方案。
我实际上想知道动态的使用是否会解决它,即最小化支持NewClassType的更改以及何时删除OldClassType,我可以简单地改变我初始化的一行 - 例如
protected dynamic MyMethod(int32 p1, bool useNewType)
{
dynamic myVar = (useNewType) ? new NewClassType() : new OldClassType(); // Is this allowed?
//So all code below stays exactly the same
myVar.name = "Hello";
myVar.age = "36";
return myVar;
}
答案 0 :(得分:2)
您可以从NewClassType
派生OldClassType
,以便它继承所有基本类型成员。
public class NewClassType : OldClassType { }
然后你必须让你的方法Generic,就像这样:
protected T MyMethod<T>(int p1) where T : OldClassType, new()
{
T myVar = new T();
myVar.name = "Hello";
myVar.age = "36";
return myVar;
}
我认为您不应该使用bool值来指定是否要返回新类类型的实例,您可以这样做:
var o = MyMethod<NewClassType>(10);
你甚至可以定义一个仍然返回OldClassType
的重载方法,但是在封面下使用你的泛型方法:
protected OldClassType MyMethod(int p1)
{
return MyMethod<OldClassType>(p1);
}
答案 1 :(得分:1)
我会避免反思,这很棘手且可能很慢。
向NewClassType
添加一个复制OldClassType
:
class NewClassType {
public NewClassType( OldClassType old )
{
Name = old.Name;
Age = old.Age;
. . .
}
. . .
}
然后:
protected object MyMethod(int32 p1, bool useNewType)
{
OldClassType myVar = new OldClassType();
myVar.name = "Hello";
myVar.age = "36";
if (!useNewType) return myVar;
return new NewClassType( myVar );
}