通用方法为T设置值

时间:2016-10-18 10:56:16

标签: c# generics

你能帮助我吗?我是通用方法的新手。我一直在寻找答案,但找不到希望你可以提供帮助。 我尝试过拳击和拆箱但是错误。 这是我的代码。

            if (input == 1)
        {
            Sum sum = new Sum();
            InputTwoDegits<Sum>(out firstNumber, out secondNumber, out firstNumberChecker, out secondNumberChecker, input, sum);
            factoryClass = sum;
            factoryClass.Compute();
        }
        else if (input == 2)
        {
            Difference dif = new Difference();
            InputTwoDegits<Difference>(out firstNumber, out secondNumber, out firstNumberChecker, out secondNumberChecker, input, dif);
            factoryClass = dif;
            factoryClass.Compute();
        }

    private static void InputTwoDegits<T>(out int firstNumber, out int secondNumber, out bool firstNumberChecker, out bool secondNumberChecker, int input, T returnClass) where T : class
    {
        T set = T(Sum);
        firstNumberChecker = Int32.TryParse(Console.ReadLine(), out firstNumber);
        //returnClass.FirstNumber = firstNumberChecker ? input : 0;
        secondNumberChecker = Int32.TryParse(Console.ReadLine(), out secondNumber);
        //returnClass.SecondNumber = secondNumberChecker ? input : 0;
    }



public abstract class BaseClass
{
    public BaseClass()
    {
        this.Compute();
    }

    public int FirstNumber { get; set; }
    public int SecondNumber { get; set; }
    public int ReturnObj { get; set; }

    public abstract void Compute();
}
public class Sum : BaseClass
{
    public override void Compute()
    {
        ReturnObj = FirstNumber + SecondNumber;
    }
}

    public class Difference : BaseClass
    {
        public override void Compute()
        {
            ReturnObj = FirstNumber - SecondNumber;
        }
    }

注释代码出错。我想设置T returnClass的值,以便我可以为其赋值。

感谢。

2 个答案:

答案 0 :(得分:1)

错误是因为虽然您已指定T是一个类,但您尚未定义该类的任何特征。但是,在您的代码中,您希望能够在T的实例上设置FirstNumberSecondNumber

解决此问题的一种方法是使用这些属性定义接口:

interface ISomeNumbers
{
  int FirstNumber{get; set;}
  int SecondNumber{get; set;}
}

然后让你的类型实现接口。现在,您可以在方法上指定通用约束:

private static void InputTwoDegits<T>(out int firstNumber, out int secondNumber, out bool firstNumberChecker, out bool secondNumberChecker, int input, T returnClass) where T : ISomeNumbers

现在,您可以设置属性,因为您告诉编译器您希望能够对T的实例执行什么操作。

答案 1 :(得分:0)

您应该将此方法更改为:

private static void InputTwoDegits<T>(
    out int firstNumber, 
    out int secondNumber, 
    out bool firstNumberChecker, 
    out bool secondNumberChecker, 
    int input, 
    T returnClass) where T : BaseClass   // <---- constraint on BaseClass instead of Class

此外,您可能会更改此方法的签名,因此它会返回一些内容。

public override void Compute()
{
    ReturnObj = FirstNumber + SecondNumber;
}