C# 返回类型为对象的泛型方法

C# 返回类型为对象的泛型方法,c#,generics,object,return,C#,Generics,Object,Return,相反,我想创建一个泛型方法,该方法返回一个对象,如下所示: ClassA { int a; public int aValue { get { return a; } } } ClassB : ClassA { int b; public int bValue { get { return b; } } } ClassC

相反,我想创建一个泛型方法,该方法返回一个对象,如下所示:

ClassA
{
        int a;
        public int aValue
        {
            get { return a; }
        }
}

ClassB : ClassA
{
      int b;
        public int bValue
        {
            get { return b; }
        }
}

ClassC : ClassA
{
      int c;
        public int cValue
        {
            get { return c; }
        }
}

public void getObject(int i) 
{
    if(i==1)
    {
        ClassB objB = new ClassB();
         objB.aValue = 20;
         objB.bValue = 30;
         Console.Writeline(objB.aValue);
         Console.Writeline(objB.bValue);
    }
    else
    {
        ClassC objC = new ClassC();
        objC.aValue = 20;
        objC.cValue = 40;
        Console.Writeline(objC.aValue);
        Console.Writeline(objC.cValue);
    }
}
public T getObject(inti),其中T:class
{
如果(i==1)
{
ClassB objB=新的ClassB();
将objB返回为T;
}
其他的
{
ClassC objC=新的ClassC();
将objC返回为T;
}
}
公共静态void main()
{
objectobj=getObject(5);
obj.aValue=20;
obj.B值=30;
obj.C值=40;
控制台写入线(对象aValue);
控制台写入线(obj.B值);
控制台写入线(对象值);
}
在这种情况下,obj=objC,因此bValue=30和cValue=40应该发生。但我不能这样做。
这是我第三次尝试。我希望至少这次我清楚了

问题似乎在于你问问题的方式

您可以在泛型约束中使用where子句来约束它


我不知道你为什么要强迫一个装箱的对象来实现一个通用的方法…

+1,这个建议也是在这个问题的前一个版本中给出的。似乎你应该询问解决问题的最佳方法,而不是如何将方钉塞进圆孔中。1) 没有人能理解为什么泛型应该在这里发挥作用。2) 这两个类是否应该有某种公共接口或基类?3) 如果您试图设置一组或另一组变量,那么必须将其添加到确定返回哪个类的相同逻辑中,那么为什么首先要设置这些类?这不是泛型的用途,我建议您重新阅读一些关于泛型的教程。这是我的第三次尝试。我希望至少这次我清楚了。
public T getObject<T>(int i) where T : class
{
    if(i==1)
    {
        ClassB objB = new ClassB();
         return objB as T;
    }
    else
    {
        ClassC objC = new ClassC();
        return objC as T;
    }
}

public static void main()
{
    Object obj = getObject<Object>(5);
    obj.aValue = 20;
    obj.bValue = 30;
    obj.cValue = 40;
    Console.Writeline(obj.aValue);
    Console.Writeline(obj.bValue);
    Console.Writeline(obj.cValue);
}