Вопрос по generics, reflection, c# – Как вы вызываете универсальный метод, если вы знаете только параметр типа во время выполнения?

7

У меня есть этот метод:

<code>public List<T> SomeMethod<T>( params ) where T : new()
</code>

Итак, я хочу назвать этоSomeMethod что хорошо, если я знаю тип:

<code>SomeMethod<Class1>();
</code>

Но если бы я толькоClass1 во время выполнения я не могу позвонить?

Так как позвонитьSomeMethod с неизвестным типом T? Я получил Тип с помощью отражения.

У меня есть Тип типа, ноSomeMethod<Type | GetType()> не работает.

Update 7. May:

Вот пример кода того, чего я хочу достичь:

<code>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication63
{
    public class DummyClass
    {
    }

    public class Class1
    {
        public string Name;
    }

    class AssemblyTypesReflection
    {
        static void Main(string[] args)
        {
            object obj = new Class1() { Name = "John" } ;

            Assembly assembly = Assembly.GetExecutingAssembly();
            var AsmClass1 = (from i in assembly.GetTypes() where i.Name == "Class1" select i).FirstOrDefault();


            var list = SomeMethod<AsmClass1>((AsmClass1)obj); //Here it fails
        }

        static List<T> SomeMethod<T>(T obj) where T : new()
        {
            return new List<T> { obj };
        }
    }
}
</code>

Это демонстрация, взятая из более широкого контекста.

Это ваш вызов API или какой-то сторонний API? Если он ваш, подумайте о его изменении, потому что генерики не решают проблему, а создают ее в этом случае. empi
SLaks ответил на твой вопрос хорошо. Я просто замечаю вам, что вы неправильно использовали словоanonymous здесь, что означает что-то другое. В вашем случае T является родовым. SimpleVar
Идея в том, что я хочу вызвать SomeMethod, и обычно я называю это как SomeMethod <Class1> (); но я знаю только как строку, что класс, который я хочу использовать, это "Class1" или какой-то другой класс. bluee

Ваш Ответ

2   ответа
8

var method = typeof(SomeClass).GetMethod("SomeMethod");
method.MakeGenericMethod(someType).Invoke(...);
Речь идет не о вызове неизвестного метода, а о параметре, который я не знаю до времени выполнения. Например. если это Class1 или Class2 и т. д. bluee
SLaks и Sixlettervariables привели меня в правильном направлении. Спасибо, парни bluee
3

Ты можешь использоватьdynamic ключевое слово в C # 4. Вам также требуется .NET 4.0 или выше .

SomeMethod((dynamic)obj);

Среда выполнения выводит фактический аргумент типа и выполняет вызов. Не удается, еслиobj является нулевым с тех пор, как не осталось информации о типе. null в C # не имеет типа.

Похожие вопросы