根据泛型方法中的类型调用方法

时间:2014-03-25 22:56:08

标签: c# generics

获取字符串并将其解析为T中给出的类型的通用函数。除了返回之外,我可以使它全部工作。我有一个bool,想把它变成T? T是bool。

public T? F<T>() where T : struct
{
   var s= GetAString();
   if(s==null) return null;
   if(typeof(T) == typeof(bool))
   {
      var b = bool.Parse(s);
      return ??
   } 
   if(typeof(T) == typeof(int))
   {
      var i = int.Parse(s);
      return ??
   } 
    ...
}

返回b不起作用

return(T?)b不起作用

返回新T?(b)

1 个答案:

答案 0 :(得分:3)

它肯定不漂亮,但是再加注到object然后转到T?(或者在这种情况下为三重播放,因为b实际上是{{1}而不是bool)会起作用:

bool?

但是,我通常会避免编写这种代码。它首先打败了使用泛型的目的。毕竟,如果您必须为您可能接受的每个类型参数编写不同的策略,那么它不是泛型解决方案。


另一种解决方案是创建解析器&#39;这样的课程:

if(typeof(T) == typeof(bool))
{
  var b = bool.Parse(s);
  return (T?)(object)(bool?)b;
} 
if(typeof(T) == typeof(int))
{
  var i = int.Parse(s);
  return (T?)(object)(int?)i;
} 

将它们静态地注册在这样的字典中:

public interface IParser {
    object Parse(string s);
}

public class BoolParser : IParser {
    public object Parse(string s) {
        return bool.Parse(s);
    }
}

public class IntParser : IParser {
    public object Parse(string s) {
        return int.Parse(s);
    }
}

现在你可以像这样编写private static Dictionary<Type, IParser> parsers = new Dictionary<Type, IParser>(); public static void Register<TResult, TParser>() where TResult : struct where TParser : IParser, new() { parsers.Add(typeof(TResult), new TParser()); } ... Register<bool, BoolParser>(); Register<int, IntParser>(); 方法:

F