2010-04-05 17 views
9

Jak mogę użyć inicjatora obiektu z jawną implementacją interfejsu w języku C#?Inicjator obiektów z jawnym interfejsem w języku 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

Czy możesz nam powiedzieć, dlaczego chcesz to zrobić? –

+7

Polecam poradę lekarza: "jeśli to boli, nie rób tego". –

+1

"Nie rób tego" nigdy nie inspiruje do innowacji. – Inisheer

Odpowiedz

3

Nie możesz. Jedynym sposobem uzyskania dostępu do jawnej implementacji jest rzutowanie na interfejs. ((IType)v).Property1 = "blah";

Teoretycznie można owinąć proxy wokół właściwości, a następnie użyć właściwości proxy podczas inicjowania. (Proxy używa rzutowania do interfejsu.)

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

jawne metody interfejsu/właściwości są prywatne (to dlatego, że nie mogą mieć modyfikator dostępu: to zawsze private i tak byłoby zbędne *). Więc nie możesz ich przypisać z zewnątrz. Równie dobrze możesz zapytać: w jaki sposób mogę przypisać prywatne właściwości/pola z zewnętrznego kodu?

(* Chociaż dlaczego nie zrobić to samo wybór z public static implicit operator to kolejna tajemnica!)

+0

Proszę rozwinąć opis jako "prywatny". Jawne metody mogą być wywoływane przez inne obiekty, co wydaje się sprzeczne z twoim opisem ?! – Ben

+0

Sądzę, że rozumiem, że jawnie zaimplementowani członkowie są prywatni w typie realizacji. AFAICT to tylko ograniczenie składni języka uniemożliwiające wygodne ustawienie jawnych elementów, co jest wstydem, ponieważ preferuję jawność ponad domyślną. – Ben

+1

@Ben Aston - "prywatny" nie jest właściwym słowem pod każdym względem, np. zwykłe prywatne pole może być dostępne wewnątrz klasy, podczas gdy jawny członek interfejsu nie może na to pozwolić (bezpośrednio). Bardziej słuszne byłoby stwierdzenie, że członkowie jawnego interfejsu nie są w ogóle * dostępni * za pośrednictwem typu, w którym są zaimplementowani (więc jeszcze bardziej prywatni niż "prywatni"!) Dostęp do nich można uzyskać tylko poprzez sam typ interfejsu. Składnia inicjalizatora obiektów jest właściwie tylko sposobem przypisywania członkom, a byłoby dziwnie, gdyby to mogło osiągnąć rzeczy, których zwykłe zadania nie mogłyby wykonać. –

Powiązane problemy