是否有可能使用c#泛型方法返回具有相同字段的不同对象?

时间:2019-01-28 17:14:25

标签: c#

我有两个相同的类,但是在不同的命名空间中,是否可以使用通用方法来实例化和填充一个或另一个对象?

namespace ns1{
   //.....

    public class class1{
        private string name;
        public string name{
            set{this.name=value;
        }
    }
}

namespace ns2{
    //....

    public class class2{
        private string name;
        public string name{
            set{this.name=value;
        }
    }
}

我已经尝试过类似的方法,但是由于T是对象,因此无法像字段“名称”那样识别T的类型:

class1 cl1 = getMyclass<Class1>("Daniel");

class2 cl2 = getMyclass<Class2>("Daniel");


private T getMyClass<T>(string name) where T : new()
{
    T tclass = new T();
    tclass.name = name;  // ***THIS IS NOT POSSIBLE***

    return tclass;

}

3 个答案:

答案 0 :(得分:3)

您可以介绍和介面

public interface INamed
{
    string Name { get; set; }
}

您的类应实现此接口

public class1: INamed { ...
public class2: INamed { ...

您的方法应该具有接口的通用约束

private T getMyClass<T>(string name) where T : INamed, new() { ...

答案 1 :(得分:1)

您可以定义一个接口或基类,在您的类中实现它,并使用该接口/基类来约束泛型。

interface IHaveName
{
  string Name { get; set;}
}

class Class1 : IHaveName
{
   ...
}

private T getMyClass<T>(string name) where T : new(), IHaveName

答案 2 :(得分:-1)

使用接口的解决方案可能是您最好的选择,但是可以在不引入接口的情况下做到这一点(在您的情况下可能不可行),即使用dynamic

private T GetMyClass<T>(string name) where T : new()
{
    dynamic tclass = new T();
    tclass.name = name;
    return tclass;
}