C# Приведение типа к другому типу с тем же объявлением - PullRequest
0 голосов
/ 19 июня 2020

Допустим, у меня есть тип X, который является абстрактным классом, например, public abstract class X. Теперь предположим, что у меня есть тип A, производный от типа Y, например, public class A : Y. И X, и Y имеют одинаковое определение:

public abstract class X
{
    public string Name { get; internal set; }

    public virtual void PrintName()
    {
        Console.WriteLine(Name);
    }
}

public abstract class Y
{
    public string Name { get; internal set; }

    public virtual void PrintName()
    {
        Console.WriteLine(Name);
    }
}

Я не могу ничего изменить внутри X (Добавить интерфейс, ...). Также я не могу получить от X, потому что программа автоматически загрузит его. Классы X и Y больше с полями, свойствами и множеством методов, но я сохранил их как можно меньше. Можно ли преобразовать A в X? Что-то вроде

X obj = (X)(new A())

Я уже пробовал: Json De / Seriliazation, используя динамику c X cls = (X)(new A() as dynamic);. Я, вероятно, мог бы использовать TypeBuilder, но у меня нет опыта использования TypeBuilder.

1 Ответ

0 голосов
/ 19 июня 2020

Я думаю, вы могли бы решить эту проблему с помощью AutoMapper: https://docs.automapper.org/en/stable/Mapping-inheritance.html

После добавления пакета Nuget AutoMapper в свой проект добавьте следующий класс:

public class XYBAProfile : AutoMapper.Profile
{
    public XYBAProfile()
    {
        CreateMap<Y, X>()
            .Include<A, B>();
        CreateMap<A, B>();
    }
}

Теперь у вас должна быть возможность создать объект X из любого объекта A:

 public static void Test()
 {
    var mapperConfig = new AutoMapper.MapperConfiguration(conf => conf.AddProfile<XYBAProfile>());
    var mapper = mapperConfig.CreateMapper();

    var a = new A() { Name = "Something" };
    X x = mapper.Map<X>(a);

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