考虑到我的项目中的重复代码:
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;
}
答案 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;
}