2016-12-17 2 views
0

Nehmen Sie diese zwei Klassen zu wissen:nameof Verwendung Mitglied der allgemeinen Klasse zuzugreifen, ohne den Typen

class NonGenericClass 
{ 
    public string Member { get; set; } 
} 

class GenericClass<T> 
{ 
    public string Member { get; set; } 
} 

ich dies leicht tun können:

nameof(NonGenericClass.Member) 

Aber ich kann das nicht tun:

nameof(GenericClass.Member) 

konnte ich dies tun:

nameof(GenericClass<object>.Member) 

Aber ich will nicht.

Gibt es eine Möglichkeit, das zu tun, was ich will, ohne es auf eine Weise tun zu müssen, die ich nicht möchte?

+0

Nun * warum * willst du 'GenericClass .Member' nicht tun? Ich stimme zu, dass es ärgerlich ist, ein Argument vom Typ "generic" (in einer Weise, die keinen Zweck erfüllt) zu spezifizieren, aber es schadet nicht wirklich. –

+0

@ JonSkeet Die rationale, ich denke, ist, dass, wenn 'T' hat eine Typ-Constraint und dieser Constraint-Typ ist jemals aus der Assembly entfernt, der Code wird nicht bauen. Vielleicht ist es keine große Sache, einen neuen generischen Typ angeben zu müssen, aber ich bin ein Set-It-and-Forget-It-Typ (wie Ron Popeil), also hoffte ich, dass es eine bessere Methode gibt – oscilatingcretin

+1

Das wäre Eine brechende Veränderung sowieso, lange bevor 'nameof' involviert wird ... und es wäre trivial, den' nameof' Gebrauch zu ändern. Aber nein, es gibt keinen anderen Weg, es zu tun. –

Antwort

1

Nein, es gibt keine Möglichkeit, nameof für einen generischen Typ (oder einen Member dieses generischen Typs) zu verwenden, ohne ein type-Argument anzugeben. Ich persönlich würde wie der Lage sein, die offene Art, wie Sie mit typeof können angeben, dh

// Would be nice, but isn't valid 
string name = nameof(GenericClass<>.Member); 

... die Unterscheidung zwischen verschiedenen generischen Typen mit unterschiedlichen arities in gleicher Weise erlauben würde (GenericClass<,>, GenericClass<,,> usw.), aber das ist gerade nicht gültig im Moment. Es gibt bereits eine feature request für diese, die etwas Unterstützung hat, aber es wird sicherlich nicht in C# 7 sein, und ich wäre überrascht, wenn es vor C# 8 im besten Fall kam.

Ich schlage vor, Sie halten nur Ihre Nase und verwenden GenericClass<int>.Member oder ähnliches. Jede Änderung, die diese Pause macht, wird wahrscheinlich weit schlimmere Probleme verursachen. Wenn Sie mit dem von Ihnen verwendeten Argument type konsistent sind, sollte eine einfache Suche und Ersetzung es beheben.

+0

Das war das erste, was ich ausprobiert habe und war enttäuscht, dass es nicht funktioniert hat. Kein Grund, warum sie es nicht tun sollten/sollten – oscilatingcretin

+0

@oscilatingcretin: Ich stimme zu - fühlen Sie sich frei, Ihre Stimme zu der verlinkten Feature-Anfrage hinzuzufügen :) –

Verwandte Themen