Как преобразовать тип объекта в определенный тип универсального класса - PullRequest
0 голосов
/ 10 июня 2019

Я унаследовал от универсальной версии списка, чтобы добавить некоторые свойства к другому универсальному классу в ядре asp.net, тогда у меня есть метод, который получает параметр объекта.В какой-то момент рабочего процесса фреймворка он конвертирует мой класс в объект и передает его этому методу.Итак, мне нужно привести или разобрать объект к определенному классу моего унаследованного класса.

    public class ClassList<T> : List<T>
    {
        public int SomeProperty {get; set;}
        ....
    }
    public void SomeMethod(object value){

    }

Мне нужно привести объект в методе SomeMethod к определенному типу созданного мной универсального класса.

Примерно так:

    ClassList<OtherClass> otherList = (ClassList<OtherClass>) object;

Проблема в том, как узнать тип универсального типа и как преобразовать объект в этот тип во время выполнения?

1 Ответ

1 голос
/ 10 июня 2019

Нет, поскольку это было boxed, только среда выполнения может динамически знать, что такое класс.

Так что SomeMethod не может знать, что такое универсальный класс, до компиляции

, например:

этот код получит ошибку:

CS0411 Аргументы типа для метода 'UserQuery.SomeClass.SomeMethod (UserQuery.ClassList)' не могут быть выведены из использования.Попробуйте явно указать аргументы типа.

public class Program
{
    public static void Main()
    {
        object datas = new ClassList<string>() { "github", "microsoft" };

        var result = SomeClass.SomeMethod(datas);//Error :  CS0411 The type arguments for method 'UserQuery.SomeClass.SomeMethod<T>(UserQuery.ClassList<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
    }
}

public class ClassList<T> : List<T>
{
    public int SomeProperty { get; set; }
}

public class SomeClass
{
    public static ClassList<T> SomeMethod<T>(ClassList<T> value)
    {
        ClassList<T> otherList = (ClassList<T>)value;
        return otherList;
    }
}
...