Можно ли использовать AutoMapper для переноса методов?

У меня есть два класса:

public class TestClass1
{
    public int TestInt { get; set; }

    public void TestMethod()
    {
        // Do something
    }
}

public class TestClass2
{
    public int TestInt { get; set; }

    public void TestMethod()
    {
        // Do something
    }
}

Я хочу создать интерфейс, который я могу использовать для обоих классов. Самое простое решение - реализовать интерфейс на TestClass1 и TestClass2, но у меня нет доступа к реализации этих классов (внешняя dll). Мне было интересно, могу ли я создать новый интерфейс и использовать AutoMapper для сопоставления TestClass1 и TestClass2 с ITestInterface:

public interface ITestInterface
{
    int TestInt { get; set; }

    void TestMethod();
}

person Wojciech Markowski    schedule 22.04.2010    source источник


Ответы (2)


Вы говорите, что вам требуется сопоставление «TestClass1 и TestClass2 с ITestInterface», однако вам понадобится экземпляр класса для сопоставления, поскольку вы не можете создать экземпляр интерфейса.

Я предполагаю, что вы пытаетесь рассматривать классы как взаимозаменяемые, преобразуя их в один и тот же интерфейс. Если это так, Automapper - это не то, на что вам следует обратить внимание - см. same-members-interchangeable/">вопрос о переполнении стека для получения некоторых подробностей о том, как управлять обработкой классов, как если бы они оба реализовывали один и тот же интерфейс (даже если у вас нет доступа к исходному коду).

person saret    schedule 22.04.2010

Вы не можете сопоставить метод как цель, только источник (используя пользовательскую проекцию):

Mapper.CreateMap<Source, Destination>()
.ForMember(dest => dest.SomeValue, 
        opt => opt.MapFrom(src => src.GetSomeValue()))

Но абсолютно невозможно «сопоставить» метод void с другим методом void. Это действительно не имеет смысла; сопоставление включает чтение из одного места и запись в другое, и вы не можете "прочитать" значение из метода void.

person Aaronaught    schedule 22.04.2010
comment
Вы правы, я не могу сопоставить значение void с значением void, но меня не интересует возвращаемое значение. Я хотел бы отобразить выполнение метода. Что-то вроде: Mapper.CreateMap‹Source, Destination›.ForMember(dest => dest.DoSomething(), opt => opt.MapFrom(src => src.DoSomething()). - person Wojciech Markowski; 22.04.2010
comment
@Woj: Тогда вы вообще не говорите о сопоставлении, вы говорите об оболочке или адаптере: en.wikipedia.org/wiki/Adapter_pattern. Только данные могут быть сопоставлены. - person Aaronaught; 22.04.2010