将Generic设置为C#中的新实例

时间:2012-01-25 14:46:23

标签: c# generics

我有一个采用Generic参数的方法。我把类型限制为两个中的一个。在我想要设置的方法中调用两个构造函数之一。

代码:

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) where T: Address_Accessor, Address
 {
   DateTime dt= DateTime.Now;
   int? eID = 1;
   int? sID = 50;

   if (typeof(T) == typeof(Address_Accessor))
     address = new Address_Accessor(dt, eID , sID);
   else
     address = new Address(dt, eID, sID);
}

编译失败说:

无法将类型'Address_Accessor'隐式转换为'T'。存在显式转换(您是否错过了演员?)

2 个答案:

答案 0 :(得分:1)

作为一个简单的解决方案(没有任何细节考虑方法使用情况)如果Address和Address_Accessor都代表一些共同的实体 - 只需引入一个通用接口并限制T来实现此接口,那么你就可以将任何实现IAddress并设置为IAddress引用(T后面)的类变为绝密。

interface IAddress
{
}

class Address_Accessor : IAddress
class Address : IAddress

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) 
where T: IAddress  
{ 
}

我觉得周围存在一些设计问题,您是否可以发布为CreateAddress()Address案例调用Address_accessor方法的代码?也许你正在寻找某种抽象工厂?

答案 1 :(得分:1)

我不明白为什么你需要那个代码但你可以将结果对象转换为T直到它返回:

object result = typeof(T) == typeof(Address_Accessor)
  ? (object) new Address_Accessor(dt, eID , sID)
  : (object) new Address(dt, eID, sID);

address = (T)result;