2013-01-21 15 views
9
abrufen

Ich versuche, eine Methode zu schreiben, die alle Typen in einer Assembly mit einem bestimmten benutzerdefinierten Attribut findet. Ich muss auch in der Lage sein, einen String-Wert anzugeben, auf den abgestimmt werden kann. Der Vorbehalt ist, dass ich in der Lage sein möchte, dies in jeder Klasse auszuführen und jeden Wert zurückzugeben.Klassenattributwert dynamisch vom Typ

Zum Beispiel: Ich möchte einen Anruf auszuführen, wie dies

Type tTest = TypeFinder.GetTypesWithAttributeValue(Assembly.Load("MyAssembly"), typeof(DiagnosticTestAttribute), "TestName", "EmailTest"); 

Meine Methode so sieht weit wie folgt aus:

public static Type GetTypesWithAttributeValue(Assembly aAssembly, Type tAttribute, string sPropertyName, object oValue) 
{ 
    object oReturn = null; 
    foreach (Type type in aAssembly.GetTypes()) 
    { 
     foreach (object oTemp in type.GetCustomAttributes(tAttribute, true)) 
     { 
      //if the attribute we are looking for matches 
      //the value we are looking for, return the current type. 
     } 
    } 
    return typeof(string); //otherwise return a string type 
} 

Mein Attribut wie folgt aussieht:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] 
public class DiagnosticTestAttribute : Attribute 
{ 
    private string _sTestName = string.Empty; 

    public string TestName 
    { 
     get { return _sTestName; } 
    } 
    public DiagnosticTest(string sTestName) 
    { 
     _sTestName = sTestName; 
    } 
} 

Für diejenigen, die mit Ausdrücken vertraut sind, würde ich gerne in der Lage sein, einen Anruf li zu machen ke:

Wo der Ausdruck meinen generischen Typ verwendet, um die Eigenschaft auszuwählen, die ich suche.

Antwort

13

Dies sollte funktionieren:

public static Type GetTypeWithAttributeValue<TAttribute>(Assembly aAssembly, Func<TAttribute, object> pred, object oValue) { 
    foreach (Type type in aAssembly.GetTypes()) { 
    foreach (TAttribute oTemp in type.GetCustomAttributes(typeof(TAttribute), true)) { 
     if (Equals(pred(oTemp), oValue)) { 
     return type; 
     } 
    } 
    } 
    return typeof(string); //otherwise return a string type 
} 

Oder noch schöner:

public static Type GetTypeWithAttributeValue<TAttribute>(Assembly aAssembly, Predicate<TAttribute> pred) { 
    foreach (Type type in aAssembly.GetTypes()) { 
    foreach (TAttribute oTemp in type.GetCustomAttributes(typeof(TAttribute), true)) { 
     if (pred(oTemp)) { 
     return type; 
     } 
    } 
    } 
    return typeof(string); //otherwise return a string type 
} 

Dies ist, wie der Aufruf wie folgt aussieht:

GetTypeWithAttributeValue<DefaultValueAttribute>(Assembly.GetCallingAssembly(), attribute => attribute.Value, 
                "string"); 

und diese jeweils:

GetTypeWithAttributeValue<DefaultValueAttribute>(Assembly.GetCallingAssembly(), 
                attribute => attribute.Value == "string"); 
+0

Das funktionierte einwandfrei. Ich musste die Assembly wechseln, weil ich sie von einem anderen anrief, aber es funktioniert großartig. Vielen Dank. –

+0

wenn ich dir mehr Cred geben könnte würde ich ;-) – Seabizkit

2

Vor langer Zeit habe ich einige Hilfsmethoden entwickelt einen Eigenschaftsnamen aus einem Ausdruck zu extrahieren,

denke ich, es wäre für Sie nützlich sein.

public static string Item<TItem, TMember>(this TItem obj, Expression<Func<TItem, TMember>> expression) 
{ 
    if (expression.Body is MemberExpression) 
    { 
     return ((MemberExpression)(expression.Body)).Member.Name; 
    } 
    if (expression.Body is UnaryExpression) 
    { 
     return ((MemberExpression)((UnaryExpression)(expression.Body)).Operand).Member.Name; 
    } 
    if (expression.Body is ParameterExpression) 
    { 
     return expression.Body.Type.Name; 
    } 
    throw new InvalidOperationException(); 
} 

Auschecken this file für mehr.

+0

Das ist hilfreich. Sobald ich herausfinden kann, wie man den Wert aus einem Attribut einer Instanzklasse extrahiert, sollte mir helfen, eine nette Schnittstelle für meine Methode zu erstellen. Vielen Dank! –

Verwandte Themen