将值传递给泛型类型

时间:2018-08-09 15:02:40

标签: c# generics

我有这样定义的方法

public static T FromValue<T>(int value) where T : Enumeration, new()
    {
        var matchingItem = parse<T, int>(value, "value", item => item.Value == value);
        return matchingItem;
    }

这是此example

中的内容

我正在做的是调用该方法并传递int并从枚举中获取匹配的字符串。所以我尝试做

string matchedString = MyclassName.FromValue<int>(0);

但这是不正确的语法,因为我不知道什么以及如何传递给此方法FromValue。获取示例也将很高兴,这样我就可以阅读它并将来解决自己。

更新 我在

这样的示例中从Enumeration类创建了类
  public  class MyClassName: Enumeration
{

    public static readonly MyClassName Dog
        = new MyClassName(0, "KL");
    public static readonly MyClassName CAT
        = new MyClassName(1, "CT");


    private MyClassName(int value, string displayName) : base(value, displayName) { }


}

2 个答案:

答案 0 :(得分:1)

int不是Enumeration的子类型,因此不满足where T: Enumeration约束。

因此,您需要调用MyclassName.FromValue<X>(0),其中XEnumeration或其子类型,例如

MyclassName.FromValue<MyEnumeration>(0)

MyEnumeration被声明为

class MyEnumeration : Enumeration { ... }

请注意,由于您已将返回类型声明为通用参数,因此这将返回MyEnumeration类型的值:

public static T FromValue<T>(int value) where T : Enumeration, new()
              ^

要获取字符串表示形式,您将必须调用ToString()或访问string类型的属性。您链接到的Enumeration类将覆盖ToString()并提供DisplayName属性。

答案 1 :(得分:1)

起初,泛型可能有点复杂。使方法通用时,需要牢记两点。

  1. 通用参数:(T
  2. 约束,如果有的话:(where T:

您问题中的通用方法如下:

public static T FromValue<T>(int value) where T : Enumeration, new()

此通用方法声明指出您有一个通用参数T,并且该参数被限制为Enumeration类型,并且必须具有公共无参数构造函数({{1} }。约束在泛型中很有用,因为它使您可以使用泛型,同时具有少量规则或限制。也许您限制了某个接口,所以您知道任何传入的new()都会在该接口中具有成员吗?可能性是无限的。

您的问题是因为您尝试使用T作为通用参数,而现在我已经解释了什么约束,所以您应该知道这是行不通的,因为int 不符合要求。