将现有方法转换为通用对象类型的最简单方法

时间:2016-06-08 20:44:42

标签: c# reflection

假设我有一个现有的方法,它总是返回一个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; 
}

2 个答案:

答案 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 );
}