2010-04-05 10 views
9

¿Cómo puedo utilizar un inicializador de objeto con una implementación de interfaz explícita en C#?inicializador de objeto con interfaz explícita 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

¿Puede decirnos por qué desea hacerlo? –

+7

recomiendo el consejo de mi médico: "si le duele, no lo haga". –

+1

"No lo hagas" nunca inspira innovación. – Inisheer

Respuesta

3

No se puede. La única forma de acceder a una implementación explícita es mediante un envío a la interfaz. ((IType)v).Property1 = "blah";

Usted puede envolver teóricamente un proxy alrededor de la propiedad, y luego utilizar la propiedad proxy en la inicialización. (El proxy usa el elenco en la interfaz)

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étodos de interfaz explícita/propiedades son privadas (esto es por lo que no pueden tener un modificador de acceso: Siempre sería private y así sería redundante *). Entonces no puedes asignarles desde el exterior. También podría preguntar: ¿cómo puedo asignar propiedades/campos privados desde un código externo?

(* Aunque por qué no hacer la misma elección con public static implicit operator es otro misterio!)

+0

Amplíe la descripción como "privada". Los métodos explícitos pueden ser invocados por otros objetos, lo cual parece estar en desacuerdo con tu descripción? – Ben

+0

Creo que entiendo que los miembros implementados explícitamente son privados para el tipo de implementación. AFAICT es simplemente una limitación de sintaxis del lenguaje que impide la configuración conveniente de los miembros explícitos, lo cual es una pena, ya que prefiero explícito sobre implícito. – Ben

+1

@Ben Aston - "privado" no es la palabra correcta en todos los aspectos, por ejemplo, un simple campo privado puede accederse dentro de la clase, mientras que un miembro explícito de la interfaz no puede permitirlo (directamente). Sería más correcto decir que los miembros explícitos de la interfaz no son accesibles * en absoluto * a través del tipo en el que se implementan (¡incluso más privados que 'privados'!). Solo se puede acceder a ellos a través del tipo de interfaz. sintaxis de inicializador de objeto es efectiva sólo una manera de asignar a los miembros, y sería raro si eso podría lograr cosas que las asignaciones ordinarias no podía. –

Cuestiones relacionadas