2011-08-17 3 views
2

인터페이스에 인터페이스로 정의 된 객체 속성을 강력하게 입력하려고합니다. 여기 내 샘플인터페이스로 정의 된 속성을 강력하게 입력하려면 어떻게합니까?

// interfaces 
public interface IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } 
} 

public interface IMyInterfaceB 
{ 
    string B { get; set; } 
} 

// POCOs 
public class pocoOneB : IMyInterfaceB 
{ 
    public B { get; set; } 
    public C { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoOneA : IMyInterfaceA 
{ 
    string A { get; set; } 
    pocoOneB B { get; set; } // fails, can I strongly type an interface?? 
} 

public class pocoTwoB : IMyInterfaceB 
{ 
    public B { get; set; } 
    public D { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoTwoA : IMyInterfaceA 
{ 
    string A { get; set; } 
    pocoTwoB B { get; set; } // fails, can I strongly type an interface?? 
} 

이 문제는 내가

pocoOneB B { get; set; } // fails, can I strongly type an interface?? 

또는 인터페이스의 구현에도 불구하고

pocoTwoB B { get; set; } // fails, can I strongly type an interface?? 

을 할 수 없다, 컴파일러는 내가하지 않았다라고이다 두 poco에 IMyInterfaceA를 올바르게 구현하십시오. 오류가 있음을 이해하지만 인터페이스가있는 속성을 강력하게 입력하는 방법이 있는지 알고 싶습니다.

이 문제를 해결하는 방법 중 하나는 인터페이스 IMyInterfaceA가 인터페이스 IMyInterfaceB의 속성을 모두 정의하고 poco의 범위를 정의하는 것입니다. 그러나 인터페이스를 사용하여 구현 된 속성을 적용하려고합니다.

강하게 poco의 속성을 입력해야하는 주된 이유는 JSON을 사용하여 전선을 소멸시키기 때문입니다.

안내해 주셔서 감사합니다. 당신이 클래스에서 동일한 서명을 할 수 있도록

+0

오류 메시지는 무엇입니까? –

+0

이것이 도움이되는지 아닌지는 잘 모르겠지만 클래스 정의에서 마우스 오른쪽 버튼으로 인터페이스를 클릭하면 인터페이스를 구현할 수있는 옵션이 있습니다. 이것은 interface.property와 같은 인터페이스의 프로퍼티와 메소드를 정의합니다. – WraithNath

답변

2
public interface IMyInterfaceA<TPoco> 
    where TPoco : IMyInterfaceB 
{  
    TPoco B { get; set; } 
} 

public class pocoOneA<TPoco> : IMyInterfaceA<TPoco> 
    where TPoco : IMyInterfaceB 
{  
    public TPoco B { get; set; } // fails, can I strongly type an interface?? 
} 

하거나

public interface IMyInterfaceA 
{  
    IMyInterfaceB B { get; set; } 
} 

public class pocoOneA : IMyInterfaceA 
{  
    public IMyInterfaceB B { get; set; } // fails, can I strongly type an interface?? 
} 
+0

@dlev : 인터페이스 정의를 업데이트하는 것을 잊었 기 때문에? (이미 업데이트 됨). 아니면 다른 문제가 있습니까? – sll

+0

전자. 이제 괜찮아. – dlev

+0

@dlev : 이것을 가리켜 주셔서 감사합니다! – sll

1
public interface IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } 
} 

귀하의 인터페이스는 IMyInterfaceB B가 있습니다.

public class pocoOneA : IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } // fails, can I strongly type an interface?? 
} 

그러나 당신은 당신이 pocoOneB 또는 pocoTwoB

중 하나를 반환 할 수있는 개체를 반환 할 때
+0

이것은 내가 피하려고하는 것입니다, 'IMyInterfaceB B'로 속성을 정의하려고합니다. 왜냐하면 JSON을 사용하여 소멸 시키려고하면 직렬기를 사용할 poco를 알 수 없기 때문입니다. 그래서 강력하게 속성에 정의 된 인터페이스가있는 poco를 입력하고 싶습니다. –

+0

제네릭 매개 변수 (내 대답 참조)를 사용하여 새로운 PocoA (pocoBInstance)과 같은 구체적인 유형을 전달하면이를 인스턴스화 할 수 있습니다. 그래서 deserializer는 pocoB의 인스턴스를 사용하여 어떤 유형이든 알 수 있습니다 (pocoA가 pocoB의 인스턴스를 가지기 때문에 일반 매개 변수없이 이벤트를 사용하고있는 경우). 더 명확히하기 위해 나는이 pocos를 탈 직렬화하는 방법을 알아야합니다. – sll

0
당신은 재산 "강력하게 입력 할"필요가 없습니다

-IMyInterfaceB이의 소비자에 필요한 모든 정보를 제공해야하는 인터페이스를 IMyInterfaceA으로 작업하십시오.

private MyInterfaceB _myInterfaceB; 

public IMyInterfaceB 
{ 
    get { return _myInterfaceB; } 
    set { _myInterfaceB = (MyInterfaceB)value; } 
} 
0

당신이 원하는 것은 공변 반환 형식이다 : 당신이 할 수있는 유형 MyInterfaceB의 인스턴스와 재산 돌아왔다. IIRC는 적어도이 형식에서는 C#으로 만들지 않았습니다.

명시 적으로 인터페이스를 구현하고 강력한 형식의 반환 값에 대해 파생 된 형식의 새 속성을 제공하여 시뮬레이션 할 수 있습니다.

그러나이 방법이 직렬화와 관련되어 있는지 잘 모르겠습니다.

// interfaces 
public interface IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } 
} 

public interface IMyInterfaceB 
{ 
    string B { get; set; } 
} 

// POCOs 
public class pocoOneB : IMyInterfaceB 
{ 
    public string B { get; set; } 
    public string C { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoOneA : IMyInterfaceA 
{ 
    public string A { get; set; } 
    IMyInterfaceB IMyInterfaceA.B{ get; set; } 
    public pocoOneB B { get{ return new pocoOneB(); } set{} } // fails, can I strongly type an interface?? 
} 

public class pocoTwoB : IMyInterfaceB 
{ 
    public string B { get; set; } 
    public string D { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoTwoA : IMyInterfaceA 
{ 
    public string A { get; set; } 
    IMyInterfaceB IMyInterfaceA.B{ get; set; } 
    public pocoOneB B { get{ return new pocoOneB(); } set{} } // fails, can I strongly type an interface?? 
} 
관련 문제