Инициализатор объекта с явным интерфейсом в C # - PullRequest
10 голосов
/ 05 апреля 2010

Как я могу использовать инициализатор объекта с явной реализацией интерфейса в 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" };

Ответы [ 2 ]

4 голосов
/ 05 апреля 2010

Явные методы / свойства интерфейса являются частными (поэтому они не могут иметь модификатор доступа: он всегда будет private и, следовательно, будет избыточным *). Таким образом, вы не можете назначить им извне. Вы также можете спросить: как я могу назначить частные свойства / поля из внешнего кода?

(* Хотя почему они не сделали такой же выбор с public static implicit operator - это еще одна загадка!)

3 голосов
/ 05 апреля 2010

Вы не можете. Единственный способ получить доступ к явной реализации - через приведение к интерфейсу. ((IType)v).Property1 = "blah";

Вы можете теоретически обернуть прокси вокруг свойства, а затем использовать свойство прокси при инициализации. (Прокси использует приведение к интерфейсу.)

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; }
}
...