Как я могу использовать объектный инициализатор с явной интерфейсной реализацией в 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" };
Вы не можете. Единственный способ получить доступ к явной реализации - это привести к интерфейсу. ((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; }
}
Явные методы / свойства интерфейса являются частными (вот почему у них не может быть модификатора доступа: он всегда будет частным
, а также быть избыточным *). Так что вы не можете назначить их извне. Вы также можете спросить: как я могу назначить частные свойства / поля из внешнего кода?
(* Хотя почему они не сделали такой же выбор с общедоступным статическим неявным оператором
- это еще одна загадка!)