C# Определить Generi c Параметр типа во время выполнения - PullRequest
0 голосов
/ 08 мая 2020

Если именованный класс существует, я хочу передать этот класс в качестве параметра типа универсальному c методу. В противном случае я хочу передать другой тип. Я не могу понять, как передать параметр типа в метод generi c.

// Does this type exist?
Type objType = Type.GetType(typeof(ModelFactory).Name + "." + content_type + "Model");

// if not, use this type instead
if (objType == null)
{
    objType = typeof(GenericModel);
}

// what to pass as the generic type argument?
var other = query.Find<objType>().ContinueWith((t) =>

Возможно ли это? Что мне передать в Find в последней строке вместо objType?

С уважением и уважением,

-John

1 Ответ

6 голосов
/ 08 мая 2020

Вы должны использовать Reflection API. Как только вы получите тип аргумента для вашего метода Find, вам необходимо получить MethodInfo из метода Find и передать экземпляр класса, который определяет этот метод, и необходимые параметры для метода, например:

public class GenericModel {}

// This class simulates the class that contains the generic Find method
public class Query {
    public void Find<T>() {
        Console.WriteLine("Invoking Find method...");
    }
}

class Program {
    static async Task Main(string[] args) {
        var theType = typeof(GenericModel);

        // Obtaining a MethodInfo from the Find method
        var method = typeof(Query).GetMethod(nameof(Query.Find)).MakeGenericMethod(theType);
        var instanceOfQuery = Activator.CreateInstance(typeof(Query));
        var response = method.Invoke(instanceOfQuery, null); // Cast the method to your return type of find.

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