閉鎖されたこの二重投稿から、あなたは近いです。object
型引数として渡していますが、これはあなたの場合と同じT
ものを返しobject
ます。ClassA
オブジェクトで定義されたプロパティを使用できないのはそのためです。ClassB
代わりに、またはのような必要な型を渡す必要があります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
variableをチェックして、返される型を決定する理由がわかりません。それはジェネリックの本当の使い方ではありません。ジェネリックの真の使用は次のようになります。
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