Объектный инициализатор с явным интерфейсом в C#

Как я могу использовать объектный инициализатор с явной интерфейсной реализацией в 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" };
10
задан Mark Seemann 5 April 2010 в 11:53
поделиться

2 ответа

Вы не можете. Единственный способ получить доступ к явной реализации - это привести к интерфейсу. ((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; }
}
4
ответ дан 4 December 2019 в 02:25
поделиться

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

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

4
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: