Интерфейс С# без статической типизации

Есть ли способ сделать что-то в этом направлении?

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; }
}

Мне не нужен тип свойств, мне просто нужны доступные свойства. Это не должно быть реализовано с помощью интерфейса, просто используя это в качестве примера.

Ответ 1

Сделать общий интерфейс:

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; }
}

Ответ 2

используйте object или общий Iface<TValue1,TValue2>

Ответ 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, ссылаться на Prop1 и Prop2 на их фактические типы, а что-либо, используя IFace, может использовать свойства с типом возврата object.

Я сам использовал что-то похожее на последний бит кода и даже версию "общий интерфейс с базовым интерфейсом" выше, но это был очень специализированный сценарий, и я не знаю, смогу ли я его решить любым другим способом.

Ответ 4

Это скорее побеждает цель интерфейса и будет нарушать строгую типизацию С#, даже динамика не поможет вам там, я боюсь. Ответ я не верю.

Ответ 5

Не совсем, но вы могли бы сделать:

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

Однако тогда Iface<string, int> и IFace<int, bool?> будут разными типами. (т.е. ваши Class1 и Class2 не будут иметь общий интерфейс)

Ответ 6

Я не знаю вашего сценария использования, но вы можете сделать это, явно реализуя интерфейс. Примечание. Ваша текущая реализация не позволяет вам присваивать значения этим свойствам, поэтому вы, вероятно, захотите добавить частный или защищенный набор элементов доступа к свойствам класса.

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; }
  }  
}

Ответ 7

использовать объект. Если вы можете предоставить сценарий, в котором он используется, люди могут дать лучшие ответы.