c# - C# 中的变量泛型返回类型

标签 c# generics

有什么方法可以让方法从方法中返回多种泛型类型中的任何一种?例如,我有以下内容:

public static T ParseAttributeValue<T>(this XElement element, string attribute)
    {
        if(typeof(T) == typeof(Int32))
        {
            return Int32.Parse(element.Attribute(attribute).Value);
        }

        if(typeof(T) == typeof(Double))
        {
            return Double.Parse(element.Attribute(attribute).Value);
        }

        if(typeof(T) == typeof(String))
        {
            return element.Attribute(attribute).Value;
        }

        if(typeof(T) == typeof(ItemLookupType))
        {
            return Enum.Parse(typeof(T), element.Attribute(attribute).Value);
        }
    }

(这只是一个非常快速的模型,我知道任何生产代码都需要在空检查等方面更加彻底...)

但编译器不喜欢它,提示 Int32 不能隐式转换为 T(它也不适用于强制转换)。我能理解。在编译时它无法知道 T 是什么,但我会事先检查它。无论如何我可以完成这项工作吗?

最佳答案

我过去做过这些类型的通用方法。获得类型推断的最简单方法是提供通用转换器函数。

public static T ParseAttributeValue<T>
          (this XElement element, string attribute, Func<string, T> converter)
{
  string value = element.Attribute(attribute).Value;
  if (String.IsNullOrWhiteSpace(value)) {
    return default(T);
  }

  return converter(value);
}

您可以像下面这样使用它:

int index = element.ParseAttributeValue("index", Convert.ToInt32);
double price = element.ParseAttributeValue("price", Convert.ToDouble);

你甚至可以提供你自己的函数并享受世界上所有的乐趣(甚至返回匿名类型):

ItemLookupType lookupType = element.ParseAttributeValue("lookupType",
  value => Enum.Parse(typeof(ItemLookupType), value));

var item = element.ParseAttributeValue("items",
  value => {
    List<string> items = new List<string>();
    items.AddRange(value.Split(new [] { ',' }));
    return items;
  });

关于c# - C# 中的变量泛型返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567300/

相关文章:

c# - 带有 IEnumerable<T> 参数的 List.AddRange 不起作用?

c# - 如何调整表格单元格的大小以适合内容

c# - 如果我想将类型约束 (T=int) 方法添加到泛型 (T) 类中,是否必须创建扩展方法?

generics - Swift 通用虚方法调用导致段错误

Scala 比较泛型?

java - 接口(interface)作为方法参数

c# - 在文本框中获取前 10 行和后 10 行 C#

c# - 将 SQL 转换为 LINQ

c# - 最小起订量测试方法 1 是否在同一类中调用第二个方法 2

c# - 通过自连接更新 List<T>?