使用泛型检索属性

时间:2017-09-21 15:49:50

标签: c# generics attributes

考虑到我的项目中的重复代码:

main.css

是否可以创建通用,以便我可以避免重复代码?沿着:

public static ReasonAttributes GetAttributes(this Reason value)
{
    var type = value.GetType();
    var name = Enum.GetName(type, value);
    if (name == null) return null;
    var field = type.GetField(name);
    if (field == null) return null;
    return Attribute.GetCustomAttribute(field, typeof(ReasonAttributes)) as ReasonAttributes;
}

我在返回行上收到错误:

public static T GetAttribute<T, T1>(T1 value)
{
    var type = value.GetType();
    var name = Enum.GetName(type, value);
    if (name == null) return default(T);
    var field = type.GetField(name);
    if (field == null) return default(T);
    return Attribute.GetCustomAttribute(field, typeof(T)) as T;
}

2 个答案:

答案 0 :(得分:4)

简单,只需设置一个类型约束,即T必须从Attribute继承。

public static T GetAttribute<T>(object value)
    where T : Attribute
{
    var type = value.GetType();
    var name = Enum.GetName(type, value);
    if (name == null) return default(T);
    var field = type.GetField(name);
    if (field == null) return default(T);

    return Attribute.GetCustomAttribute(field, typeof(T)) as T;
}

你根本不需要T1;你可以在任何事情上致电GetType()(当然除了null)。你甚至从未在方法的主体中使用T1,所以显然参数的类型并不重要。

where T : class也会起作用,但你也可以让编译器阻止某人不假思索地调用GetAttribute<String>()

答案 1 :(得分:3)

你不应该在方法定义中添加where T : class,这样你的代码就知道T can是一个类并且可以实例化吗?

public static T GetAttribute<T, T1>(T1 value) where T : class
{
    var type = value.GetType();
    var name = Enum.GetName(type, value);
    if (name == null) return default(T);
    var field = type.GetField(name);
    if (field == null) return default(T);
    return Attribute.GetCustomAttribute(field, typeof(T)) as T;
}