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

C# 在C中将Generic设置为新实例#,c#,generics,C#,Generics,我有一个采用泛型参数的方法。我已将类型限制为两种类型中的一种。在方法中,我想设置调用两个构造函数中的一个 代码: 内部静态void CreateAddress(out T address,bool isSave,int?cID),其中T:address\u Accessor,address { DateTime dt=DateTime.Now; int?eID=1; int?sID=50; if(typeof(T)=typeof(地址\访问者)) 地址=新地址\访问器(dt、eID、sID);

我有一个采用泛型参数的方法。我已将类型限制为两种类型中的一种。在方法中,我想设置调用两个构造函数中的一个

代码:

内部静态void CreateAddress(out T address,bool isSave,int?cID),其中T:address\u Accessor,address
{
DateTime dt=DateTime.Now;
int?eID=1;
int?sID=50;
if(typeof(T)=typeof(地址\访问者))
地址=新地址\访问器(dt、eID、sID);
其他的
地址=新地址(dt、eID、sID);
}
编译失败说明:


无法将类型“Address\u Accessor”隐式转换为“T”。如果Address和Address\u Accessor都代表某个公共实体,则存在显式转换(是否缺少强制转换?

作为一个简单的解决方案(没有任何关于方法使用情况的详细信息)只要引入一个公共接口并限制
T
来实现此接口,然后,您将能够识别实现
IAddress
的任何类,并将其设置为
IAddress
引用(在T后面)

界面设计
{
}
类地址\u访问器:IAddress
班级地址:IAddress
内部静态void CreateAddress(out T地址、bool isSave、int?cID)
T:我的衣服在哪里
{ 
}

我觉得有一些设计上的问题,你能为
Address
Address\u accessor
案例发布一个调用
CreateAddress()
方法的代码吗?也许您正在寻找某种抽象工厂?

我不明白您为什么需要该代码,但您可以将结果对象转换为t,直到返回它:

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

address = (T)result;

仿制药似乎非常适合这里。看起来重载方法也可以。Address_访问器和Address之间的关系是什么?这是不正确的,泛型允许您处理特定类型,不仅仅是动态地混合和匹配类型。为什么在方法中有一个
out
参数,而不返回任何内容,而只是返回地址?这里可能我错了,但您是否试图定义
t
可以从多个类继承?C#不支持多重继承。更好的是,完全忘记泛型,只使用IAddress而不是t。这假设两种类型之间存在一种只对其中一种明显的形式(
Address
)的相关链接,如果
IAddress
仅用于此目的,则这是一个坏习惯。分配有效,但第二个分配错误:地址=(T)新地址(dt、eID、sID);我想我可以使用:address=(T)newaddress_访问器(dt,eID,sID);没有if语句。另一个版本在这里,但您应该考虑在类型层次结构中进行更改以解决此错误。我的代码是一种循环方式。不同的错误:无法确定条件表达式的类型,因为“Address\u Accessor”和“Address”之间没有隐式转换——我将为此代码尝试不同的方法。谢谢
interface IAddress
{
}

class Address_Accessor : IAddress
class Address : IAddress

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) 
where T: IAddress  
{ 
}
object result = typeof(T) == typeof(Address_Accessor)
  ? (object) new Address_Accessor(dt, eID , sID)
  : (object) new Address(dt, eID, sID);

address = (T)result;