2016-06-11 12 views
1

Der einfachste Weg, um mein Problem zu beschreiben, ist mit Beispielcode. Ich weiß, dass dies nicht kompiliert werden, aber ich brauche eine ähnliche OptionStatisches Klassenmitglied und Zugriff durch Generics überschreiben

abstract class Foo 
{ 
protected abstract static ElementName {get;} 
} 
class Bar : Foo 
{ 
protected static override ElementName 
{ 
    get 
    { 
     return "bar"; 
    } 
} 
} 
class Baz<T> where T : Foo 
{ 
public string ElementName 
{ 
    get 
    { 
     return T.ElementName; 
    } 
} 
} 

Grettings

+0

Mögliches Duplikat [? Gibt es eine Möglichkeit, eine C# Klasse zu zwingen, bestimmte statische Funktionen zu implementieren] (http: // Stackoverflow. com/questions/577749/is-there-a-way-for-force-ac-sharp-Klasse-zu-implementieren-bestimmte-statische-Funktionen) –

Antwort

3

Dies kann nicht in der Weise geschehen, die Sie wollen, aber Sie können etwas ähnliches mit Reflexion erreichen. Hier ist ein Beispiel bietet zwei mögliche Lösungen für Ihr Problem (aktualisiert):

abstract class Foo 
{ 
    protected abstract string _ElementName { get; } 

    public static string GetElementName<T>() where T : Foo, new() 
    { 
     return typeof(T).GetProperty("_ElementName", BindingFlags.Instance | BindingFlags.NonPublic)? 
         .GetValue(new T()) as string; 
    } 

    public static string GetStaticElementName<T>() where T : Foo, new() 
    { 
     return typeof(T).GetProperty("ElementName", BindingFlags.Static | BindingFlags.NonPublic)? 
         .GetValue(null) as string; 
    } 
} 

class Bar : Foo 
{ 
    protected static string ElementName 
    { 
     get 
     { 
      return "StaticBar"; 
     } 
    } 

    protected override string _ElementName 
    { 
     get 
     { 
      return "Bar"; 
     } 
    } 
} 

class FooBar : Bar 
{ 
    protected static string ElementName 
    { 
     get 
     { 
      return "StaticFooBar"; 
     } 
    } 

    protected override string _ElementName 
    { 
     get 
     { 
      return "FooBar"; 
     } 
    } 
} 

class Baz<T> where T : Foo, new() 
{ 
    public string ElementName 
    { 
     get 
     { 
      return Foo.GetElementName<T>(); 
     } 
    } 

    public string StaticElementName 
    { 
     get 
     { 
      return Foo.GetStaticElementName<T>(); 
     } 
    } 
} 

... 

Console.WriteLine(new Baz<Bar>().ElementName); // Bar 
Console.WriteLine(new Baz<FooBar>().ElementName); // FooBar 
Console.WriteLine(new Baz<Bar>().StaticElementName); // StaticBar 
Console.WriteLine(new Baz<FooBar>().StaticElementName); // StaticFooBar 
+0

Vielen Dank, das sollte die Lösung sein. Aber die GetProperty findet keinen Wert Fall wird nicht behandelt – R3turnz

+0

was meinst du, kannst du ein Beispiel geben? – NValchev

+0

Wenn GetProperty aufgerufen wird, aber keine Eigenschaft vorhanden ist, wird null zurückgegeben. Die GetValue-Methode löst nun eine NullReferenceException aus, oder? – R3turnz

Verwandte Themen