2010-04-05 5 views
9

Come è possibile utilizzare un inizializzatore di oggetti con un'implementazione esplicita dell'interfaccia in C#?Inizializzatore oggetto con interfaccia esplicita in C#

public interface IType 
{ 
    string Property1 { get; set; } 
} 

public class Type1 : IType 
{ 
    string IType.Property1 { get; set; } 
} 

... 

//doesn't work 
var v = new Type1 { IType.Property1 = "myString" }; 
+0

Puoi dirci perché desideri farlo? –

+7

Raccomando il consiglio del mio medico: "se fa male, non farlo". –

+1

"Non farlo" non ispira mai l'innovazione. – Inisheer

risposta

3

Non è possibile. L'unico modo per accedere a un'implementazione esplicita è attraverso un cast per l'interfaccia. ((IType)v).Property1 = "blah";

Si può teoricamente avvolgere un proxy attorno alla proprietà e quindi utilizzare la proprietà proxy in fase di inizializzazione. (Il proxy utilizza il cast per l'interfaccia.)

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo() { ProxyBar = "Blah" }; 
    } 
} 

class Foo : IFoo 
{ 
    string IFoo.Bar { get; set; } 

    public string ProxyBar 
    { 
     set { (this as IFoo).Bar = value; } 
    } 
} 

interface IFoo 
{ 
    string Bar { get; set; } 
} 
4

metodi di interfaccia espliciti/proprietà sono private (questo è il motivo per cui essi non possono avere un modificatore di accesso: sarebbe sempre private e così sarebbe * ridondante). Quindi non puoi assegnarli da fuori. Potresti anche chiedere: come posso assegnare a proprietà/campi privati ​​da codice esterno?

(* Anche se il motivo per cui non ha fatto la stessa scelta con public static implicit operator è un altro mistero!)

+0

Espandi la descrizione come "privata". I metodi espliciti possono essere richiamati da altri oggetti, il che sembra in disaccordo con la tua descrizione ?! – Ben

+0

Penso di capire che i membri esplicitamente implementati sono privati ​​del tipo di implementazione. AFAICT è semplicemente una limitazione della sintassi del linguaggio che impedisce la comoda impostazione di membri espliciti, il che è un vero peccato, visto che preferisco l'esplicito al di sopra dell'implicito. – Ben

+1

@ Ben Aston - "privato" non è la parola giusta a tutti gli effetti, ad es. un semplice campo privato può essere acceduto all'interno della classe mentre un membro esplicito dell'interfaccia non può nemmeno consentirlo (direttamente). Sarebbe più corretto dire che i membri dell'interfaccia esplicita non sono accessibili * in tutto * tramite il tipo in cui sono implementati (quindi anche più privati ​​di 'private'!). È possibile accedervi solo tramite il tipo di interfaccia stesso. La sintassi di inizializzazione dell'oggetto è in realtà solo un modo di assegnare ai membri, e sarebbe strano se ciò potesse ottenere cose che i compiti ordinari non potevano ottenere. –