Общий метод для похожих объектов - PullRequest
1 голос
/ 19 августа 2010

C # 4.0 Если у меня есть N классов (сущностей) с абсолютно одинаковыми свойствами, у них нет общего интерфейса или общего наследования. Я хочу иметь метод, чтобы иметь возможность передавать любые их экземпляры, без копирования каких-либо свойств из одного объекта в другой. Я думаю, что должно быть несколько способов сделать это в .NET 4.0.

например, каким-либо образом используя ключевые слова var или dynamicik или используя общие типы. Может быть что-то вроде этого:

    public void MyMethod<MyType>(AnyType myInstance)
    {
        Type myType = typeof(T);
        myInstance = myInstance as myType;

        AppendToFile(myInstance.Field1);
        AppendToFile(myInstance.Field2);
    }

Сейчас я расследую это, может быть, у кого-то есть какие-то идеи по этому поводу.

Ответы [ 4 ]

2 голосов
/ 19 августа 2010

Лучшим способом было бы изменить классы, чтобы просто реализовать интерфейс.

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

Это позволит вам последовательно работать с интерфейсом IMyInterface вместо прямой работы с динамикой.

Например,:

public interface IMyInterface
{
      string Field1 { get; }
      string Field2 { get; }
}

public class MyDefaultInterface : IMyInterface
{
      private Dynamic _dynamic;
      public MyDefaultInterface(dynamic target)
      {
          _dynamic = target;
      }
      public string Field1 { get { return _dynamic.Field1; } }
      public string Field2 { get { return _dynamic.Field2; } }    
}
2 голосов
/ 19 августа 2010

Если вы не хотите или не можете получить их или добавить интерфейс, тогда вам придется использовать dynamic

Я полагаю, что это будет сделано, при условии, что AppendToFile принимает динамические параметры илиField1 и Field2 всегда одинаковые типы.

public void MyMethod(dynamic myInstance)
{
    AppendToFile(myInstance.Field1);
    AppendToFile(myInstance.Field2);
}
1 голос
/ 19 августа 2010

Если вы хотите использовать dynamic, вы можете использовать это:

public void MyMethod(dynamic myInstance)
{
    AppendToFile(myInstance.Field1); //note: you will get no intellisense support
    AppendToFile(myInstance.Field2);
}
0 голосов
/ 19 августа 2010

Один из способов - использовать отражение (не зависит от .NET 4.0):

object field1Value = myType.GetField("Field1").GetValue(myInstance);

Я должен спросить, нельзя ли изменить классы для реализации того же интерфейса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...