Pergunta

Como posso usar um inicializador de objeto com uma implementação explícita de interface em 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" };
Foi útil?

Solução

Você não pode. A única maneira de acessar uma implementação explícita é através de um elenco na interface. ((IType)v).Property1 = "blah";

Teoricamente, você pode envolver um proxy em torno da propriedade e, em seguida, usar a propriedade Proxy na inicialização. (O proxy usa o elenco na 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; }
}

Outras dicas

Métodos/propriedades de interface explícitos são privados (é por isso que eles não podem ter um modificador de acesso: sempre seria private E assim seria redundante*). Então você não pode atribuir a eles de fora. Você também pode perguntar: como posso atribuir a propriedades/campos privados do código externo?

(* Embora por que eles não fizeram a mesma escolha com public static implicit operator é outro mistério!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top