Как выполнить upcast с использованием Generic Type Class для формальной реализации? - PullRequest
0 голосов
/ 27 августа 2018

Когда мы пытаемся выполнить преобразование класса Generic Type в формальную реализацию, это приводит к ошибке приведения.

В приведенном ниже коде вы можете видеть, что у меня есть FormalClass, который является реализацией GenericTypeClass.Когда я пытаюсь выполнить приведение из GenericTypeClass к FormalClass, он выдает следующую ошибку:

" [System.InvalidCastException: Невозможно привести объект типа 'GenericTypeClass`1 [TestType]' к типу 'FormalClass »Automapper?JSON сериализация?Другое?

Ниже приведен пример dotnetfiddle (https://dotnetfiddle.net/LLg0vp):

using System;

public class Program
{
    public static void Main()
    {
        var a = new GenericTypeClass<TestType>();

        var b = a as FormalClass;
        if (b == null)
            Console.WriteLine("'a as Formal' Is NULL");

        try
        {
            var c = (FormalClass)a;
        }
        catch (Exception ex)
        {
            Console.WriteLine("'(FormalClass)a' gives this error: " + ex.Message);
        }
    }
}

public class FormalClass : GenericTypeClass<TestType>
{
}

public class GenericTypeClass<T>
    where T : class, IType
{
}

public class TestType : IType
{
}

public interface IType
{
}

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы не можете сделать это с наследованием.Как только объект создан с типом GenericTypeClass<TestType>, он никогда не может стать FormalClass.

Параметры:

  1. Изучить способы создания FormalClass вместо GenericTypeClass<TestType>.
    • Это может быть просто или сложно в зависимости от потока вашего кода.
  2. Создать новый FormalClass и использовать Automapper для копирования значений свойств в него
    • Изменения свойства в новом объекте FormalClass не будут влиять на исходный объект Generic.
  3. Вместо того, чтобы FormalClass наследовать от GenericTypeClass<TestType>', make it a wrapper for a GenericTypeClass 'ипередать в GenericTypeClass в конструкторе.
    • Любое новое свойство, добавленное к классу Generic, должно быть добавлено к FormalClass

Я включил пример кода для метода-оболочки.


using System;

public class Program
{
    public static void Main()
    {
        var a = new GenericTypeClass<TestType>();
        var b = new FormalClass(a);
        a.Name = "NameA";
        b.Name = "NameB";
        Console.WriteLine(a.Name);
        Console.WriteLine(b.Name);
    }
}

public class FormalClass
{
    GenericTypeClass<TestType> _inner;
    public FormalClass(GenericTypeClass<TestType> parameter)
    {
        _inner = parameter;
    }

    public string Name
    {
        get
        {
            return _inner.Name;
        }

        set
        {
            _inner.Name = value;
        }
    }
}

public class GenericTypeClass<T>
    where T : class, IType
{
    public string Name
    {
        get;
        set;
    }
}

public class TestType : IType
{
}

public interface IType
{
}
0 голосов
/ 27 августа 2018

Ваш пример можно упростить следующим образом (обратите внимание, что генерикам здесь нечего делать):

void Main()
{
    var a = new BaseClass();

    var b = a as DerivedClass;
    if (b == null)
        Console.WriteLine("'a as Derived' Is NULL");
}


public class BaseClass
{
}

public class DerivedClass : BaseClass
{
}

... и, конечно же, это никогда не сработает.Производные классы могут быть возвращены к базовому классу, но не наоборот.

...