Domanda

Ho istanze della classe A e B, ed entrambe le classi implementano un membro di 'Testo'. C'è un modo per accedere membro di testo in modo generico? Spero in qualcosa di analogo al modo in javascript di dire semplicemente:

instance['Text'] = value;

Nota: queste due classi, purtroppo, non sia implementano la stessa interfaccia con un membro di testo

.
È stato utile?

Soluzione

A differenza di JavaScript, C # è un linguaggio statico e se entrambe le classi non implementano un'interfaccia comune o classe di base è possibile utilizzare la reflection per raggiungere lo stesso obiettivo.

instance.GetType().GetProperty("Text").SetValue(instance, "new value", null);

Altri suggerimenti

Se non è possibile effettuare A e B implementare la stessa interfaccia, allora avete bisogno di usare riflessione per accedere a qualsiasi membro della classe in base al nome, qualcosa di simile a questo:

typeof(A).GetProperty("Text").GetValue(theInstance, null);

dove theInstance sarebbe un'istanza della classe A.

Idealmente si dovrebbe avere classe singola con elemento "Testo" che sarà base per A e B. Probabilmente non è comoda, ma è più affidabile e corretta. Cercate di non usare riflessione dove si può fare lo stesso in altro modo.

Se si può fare A e B implementare la stessa interfaccia

 interface ISomeGenericNameForAAndB
{
    string Text { get; }
}
class A :ISomeGenericNameForAAndB
{
    public string Text { get { return "some Text from A"; } }    
}
class B : ISomeGenericNameForAAndB
{
    public string Text { get { return "some Text from B"; } }
}

ISomeGenericNameForAAndB anAInstance = new A();
ISomeGenericNameForAAndB aBInstance = new B();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top