没有静态类型的C#接口

时间:2010-08-13 14:57:34

标签: c#

有没有办法沿着这些方向做点什么?

interface Iface
{
  [anytype] Prop1 { get; }
  [anytype] Prop2 { get; }
}

class Class1 : Iface
{
  public string Prop1 { get; }
  public int Prop2 { get; }
}

class Class2 : Iface
{
  public int Prop1 { get; }
  public bool? Prop2 { get; }
}

我不关心属性的类型,我只需要可用的属性。这不必使用接口实现,只需使用它作为示例。

7 个答案:

答案 0 :(得分:25)

使界面通用:

interface Iface<T1,T2>
{
   T1 Prop1  { get; }
   T2 Prop2  { get; }
}

或者,创建object类型的属性:

interface Iface
{
   object Prop1  { get; }
   object Prop2  { get; }
}

如果您使用的是.NET 4.0,您甚至可以创建dynamic类型的属性:

interface Iface    {
   dynamic Prop1  { get; }
   dynamic Prop2  { get; }
}

答案 1 :(得分:5)

使用object或通用Iface<TValue1,TValue2>

答案 2 :(得分:3)

您必须使用对象或提供通用接口。

通用版本如下:

interface IFace<T1, T2>
{
   T1 Prop1 { get; }
   T2 Prop1 { get; }
}

这将让实现类型为它们提供它想要的任何类型的属性,但缺点是无论何时接受接口,您都需要指定这两种类型:

public void DoSomething(IFace<int, string> sadFace)
...

这通常是有问题的,至少非常有限,它可以通过为接口提供基本接口来“解决”,其中两个属性都可用于object返回类型。

我认为最好的解决方案,不用重新思考你的方法就是定义一个接口IFace:

interface IFace
{
   object Prop1 { get; }
   object Prop1 { get; }
}

然后在你的类中实现接口显式,如下所示:

class MyClass: IFace
{
   public string Prop1 { get; }
   public int Prop2 { get; }

   object IFace.Prop1 { get; }
   object IFace.Prop1 { get; }
}

这将允许知道对象属于MyClass类型的用户按其实际类型引用Prop1Prop2,使用IFace的任何内容都可以使用返回类型为object

我自己使用的东西看起来像最后一段代码,甚至是上面的“基础接口通用接口”版本,但这是一个非常专业的场景,我不知道我是否能够解决它任何其他方式。

答案 3 :(得分:1)

这相当违背了界面的目标,并且会违反C#的严格打字,即使是动态也不会帮助你,我担心。答案是我不相信。

答案 4 :(得分:1)

不是,但你可以这样做:

interface Iface<TType1, TType2>
{ 
  TType1 Prop1 { get; } 
  TType2 Prop2 { get; } 
}

然而,Iface<string, int>IFace<int, bool?>将是不同的类型。 (即,您的Class1&amp; Class2没有通用界面

答案 5 :(得分:1)

我不知道您的使用场景,但您可以通过显式实现接口来实现此目的。注意:您当前的实现使您无法为这些属性赋值,因此您可能希望向类属性添加私有或受保护的set访问器。

interface Iface
{
  object Prop1 { get; }
  object Prop2 { get; }
}

class Class1 : Iface
{
  public string Prop1 { get; }
  public int Prop2 { get; }

  object Iface.Prop1
  {
      get { return Prop1; }
  }

  object Iface.Prop2
  {
      get { return Prop2; }
  }      
}

class Class2 : Iface
{
  public int Prop1 { get; }
  public bool? Prop2 { get; }

  object Iface.Prop1
  {
      get { return Prop1; }
  }

  object Iface.Prop2
  {
      get { return Prop2; }
  }  
}

答案 6 :(得分:1)

使用对象。 如果你能提供一个使用它的场景,人们可以给出更好的答案。