2017-09-21 6 views

答えて

4

簡単、ちょうどTAttributeから継承しなければなりませんと言う型の制約を置く:

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; 
} 

私は戻りライン上のエラーを取得します。

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

私よりもはるかに良い答えです。良い仕事先生:-) – Wndrr

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; 
} 
関連する問題