是否可以在不传递约束类型的情况下检索约束类型的泛型参数?

时间:2014-07-22 14:30:12

标签: c# generics

我有以下函数来检索枚举上给定类型属性的值:

public interface IAttribute<T>
{
    T Value { get; }
}

public static class EnumExtensions
{
    public static TAttributeValue GetAttribute<TAttribute, TAttributeValue>(this Enum enumValue) where TAttribute : IAttribute<TAttributeValue>
    {
        var enumType = enumValue.GetType();
        var field = enumType.GetField(enumValue.ToString());
        var attributes = field.GetCustomAttributes(typeof(TAttribute), false);
        return attributes.Length == 0
            ? default(TAttributeValue)
            : ((TAttribute)attributes[0]).Value;
    }
}

像这样使用:

public class GenericStringAttribute : Attribute, IAttribute<string>
{
    private readonly string value;

    public GenericStringAttribute(string value)
    {
        this.value = value;
    }

    public string Value
    {
        get { return this.value; }
    }
}

public enum Thing
{
    [GenericString("thing's value")]
    Thing = 0,
}

public static class ThingExtensions
{
    public static string GetGenericStringValue(this Thing enumThing) 
    {
        return enumThing.GetAttribute<GenericStringAttribute, string>();
    }
}

但我不禁想知道是否有可能以某种方式删除GetAttribute<T, K>()的第二个类型参数,因为该类型信息作为泛型参数存储到第一个类型参数T(或父类)第一种类型)。我发现很难尝试,因为我显然似乎需要两种类型定义,并且似乎不能约束“继承自IAttribute”的“变量泛型类型”,同时仍然保持原始类型和IAttribute的泛型参数的类型。

0 个答案:

没有答案