2010-04-05 25 views
9

Comment utiliser un initialiseur d'objet avec une implémentation d'interface explicite en C#?Initialiseur d'objet avec interface explicite en 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

Pouvez-vous nous dire pourquoi vous souhaitez le faire? –

+7

Je recommande le conseil de mon médecin: "si ça fait mal, ne le fais pas". –

+1

"Ne pas le faire" n'inspire jamais l'innovation. – Inisheer

Répondre

3

Vous ne pouvez pas. La seule façon d'accéder à une implémentation explicite consiste à utiliser un cast vers l'interface. ((IType)v).Property1 = "blah";

Vous pouvez théoriquement enrouler un proxy autour de la propriété, puis utiliser la propriété du proxy lors de l'initialisation. (Le proxy utilise la conversion à l'interface.)

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

méthodes/propriétés d'interface explicites sont privées (ce qui est la raison pour laquelle ils ne peuvent pas avoir un modificateur d'accès: il serait toujours private et serait donc redondant *). Vous ne pouvez donc pas les affecter de l'extérieur. Vous pourriez aussi bien demander: comment puis-je affecter à des propriétés privées/champs de code externe?

(* Bien pourquoi ils ne faisaient pas le même choix avec public static implicit operator est un autre mystère!)

+0

Veuillez développer la description comme "privé". Des méthodes explicites peuvent être invoquées par d'autres objets, ce qui semble en contradiction avec votre description ?! – Ben

+0

Je crois comprendre que les membres explicitement implémentés sont privés au type d'implémentation. AFAICT c'est simplement une limitation de syntaxe de langage empêchant le réglage commode des membres explicites, ce qui est une honte, vu que je préfère explicite sur implicite. – Ben

+1

@Ben Aston - "privé" n'est pas le mot juste à tous égards, par ex. un simple champ privé peut être accédé à l'intérieur de la classe alors qu'un membre d'interface explicite ne peut même pas le permettre (directement). Il serait plus correct de dire que les membres de l'interface explicite ne sont pas accessibles * du tout au type dans lequel ils sont implémentés (donc plus privés que 'private'!). Vous pouvez seulement y accéder via le type d'interface lui-même. La syntaxe d'initialisation d'objet n'est en fait qu'un moyen d'assigner aux membres, et il serait étrange que cela puisse réaliser des choses que les affectations ordinaires ne pourraient pas accomplir. –