如何在C#中将对象转换为可空的泛型?

时间:2016-12-01 12:53:46

标签: c# generics

我有一个包含问题答案的课程

答案存储在字符串

我创建了一个类似的方法:

public void set_answer(object obj){
   .....
}

这将把一个变量作为争论,并根据问题类型将其更改为字符串表示,因此,例如,如果答案是一个字符串,它将保持原样,如果它是一个DateTime它将将其更改为yyyy-MM-dd格式以及大约8个其他转换

我希望创建相反的方法,它将返回原始类型的答案

我有以下代码:

public T? get_answer<T>() {
    //this means that the answer has not been set yet
    if (string.IsNullOrWhiteSpace(_answer)) return null; 
    object reply = null;
    switch (_answer_type) {
        ...do stuff here to transform the string to the correct type, which will match T
    }
    <here is the problem>
}

在此代码的末尾,reply变量将包含null或T

类型的变量

我该如何返回该值?

在我的代码中,我会像这样使用它:

 DateTime? date = question.get_answer<DateTime>();

如果尚未设置答案或请求的类型不正确,则应返回null(即要求在Tupple问题上提供日期时间答案)

提前感谢您提供的任何帮助

1 个答案:

答案 0 :(得分:0)

如果您有MyMethod<T>,并且大部分内容都包含if (T is Type1) {...} else if (T is Type2) {...} else if [etc]等代码,那么通常不应该首先使用通用方法

在这种情况下,我建议使用它:

public class MyClass
{
  public string _answer;

  public DateTime? GetDate()
  {
      DateTime result;
      if (DateTime.TryParse(_answer, out result)) return result;
      return null;
  }

  public int? GetInt()
  {
      int result;
      if (int.TryParse(_answer, out result)) return result;
      return null;
  }
  // etc
}

并测试它:

public void TestIt()
{
    var x = new MyClass { _answer = "gaga" };
    var d = x.GetDate();
    var i = x.GetInt();
    // etc
}

或者如果你必须使用一个obj ...

public void TestIt()
{
    var x = new MyClass { _answer = "gaga" };
    object obj = x.GetDate();
    if (obj == null) obj = x.GetInt();
    // etc
}

或者在一个声明中:

public void TestIt()
{
    var x = new MyClass { _answer = "gaga" };
    var obj = (object) x.GetDate() ?? x.GetInt() /* ?? [etc] */ ;
}