от вашего this double-post, который закрыт, вы близки. Вы передаете 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
решить, что тот тип, который должен быть возвращен. Это не настоящее использование дженериков. Подлинное использование дженериков может выглядеть следующим образом:
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;
}
}
но улов вы должны проверить тип от вызывающей стороны (Main).
И если вы хотите назначить свойства bValue
и cValue
на обоих ClassB
и ClassC
объектов, то вы должны написать эти свойства в ClassA
.
Кроме того, вы используете только get
аксессуар, вам необходимо указать set
.
Дайте классу A и B базовый класс или интерфейс commom и ограничите T этим типом. – asawyer
- или просто бросить: "return (T) objectA;" и т.п. –
@ 500-InternalServerError Затем, когда кто-то говорит 'MethodGeneric', они возвращают ваш тезка обратно в ответ. –
asawyer