如何强烈键入已定义为接口的属性?

时间:2011-08-17 15:49:07

标签: c# interface

我试图强烈键入已在接口中定义为接口的对象属性。这是我的样本

// 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在poco上完全定义接口IMyInterfaceB的属性,但是我试图强制使用接口实现属性。

我需要强烈输入poco属性的主要原因是因为我正在使用JSON通过电线进行消毒。

感谢您提供任何指导。

4 个答案:

答案 0 :(得分: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?? 
} 

答案 1 :(得分: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

答案 2 :(得分:0)

您不需要“强烈键入”该属性 - 接口IMyInterfaceB应提供IMyInterfaceA消费者所需的所有信息。您可以做的是使用MyInterfaceB类型的实例支持您的属性:

private MyInterfaceB _myInterfaceB;

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

答案 3 :(得分:0)

你想要的是协变返回类型。 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??
}