从你这个封闭的双柱中,你很接近。您object
作为类型参数传递,它将再次返回与您的情况相同T
的参数。object
这就是为什么你不能使用ClassA
对象上定义的属性。相反,您应该传递所需的类型,例如ClassB
or ClassC
。可能是这样的:
public T getObject<T>(int i) where T : ClassA
{
if(i == 1)
{
ClassB objB = new ClassB();
return objB as T;
}
else
{
ClassC objC = new ClassC();
return objC as T;
}
}
public static void main()
{
var obj = getObject<ClassB>(5); //which wont work anyway since i == 5 !!
obj.aValue = 20;
obj.bValue = 30;
//obj.cValue = 40; this wont work since obj is of type ClassB
//or
var obj = getObject<ClassC>(5);
obj.aValue = 20;
//obj.bValue = 30; this wont work since obj is of type ClassC now
obj.cValue = 40;
}
我不确定你为什么要检查变量int i
来决定应该返回什么类型。这不是对泛型的真正使用。真正使用泛型可能如下所示:
public T getObject<T>(int i) where T : ClassA
{
return new T(); //without the use of int i
}
如果int i
是什么决定了返回哪个对象,那么为什么要使用泛型呢?你可以这样做:
public ClassA getObject(int i)
{
if(i == 1)
{
ClassB objB = new ClassB();
return objB;
}
else
{
ClassC objC = new ClassC();
return objC;
}
}
public static void main()
{
var obj = getObject(5);
if (obj is ClassB)
{
obj.aValue = 20;
obj.bValue = 30;
//obj.cValue = 40; this wont work since obj is of type ClassB
}
//or
var obj = getObject(5);
if (obj is ClassC)
{
obj.aValue = 20;
//obj.bValue = 30; this wont work since obj is of type ClassC
obj.cValue = 40;
}
}
但问题是您必须从调用方(主要)检查类型。
如果你想在和对象上分配属性bValue
,那么你应该把这些属性写在.cValue
ClassB
ClassC
ClassA
此外,您仅使用get
访问器,还需要set
分配值。