Вызвать не универсальный метод с универсальными аргументами, определенными в универсальном классе - PullRequest
6 голосов
/ 02 января 2012

Вот моя проблема;

public class MyClass<T>
{
   public void DoSomething(T obj)
   {
      ....
   }
}

То, что я сделал, это:

var classType = typeof(MyClass<>);
Type[] classTypeArgs = { typeof(T) };
var genericClass = classType.MakeGenericType(classTypeArgs);
var classInstance = Activator.CreateInstance(genericClass);
var method = classType.GetMethod("DoSomething", new[]{typeof(T)});
method.Invoke(classInstance, new[]{"Hello"});

В вышеприведенном случае я получаю исключение: Операции с поздним связыванием не могут быть выполнены для типов или методов, для которых ContainsGenericParameters имеет значение true.

Если я попытаюсь сделать метод универсальным, то снова произойдет сбой за исключением: MakeGenericMethod может быть вызван только для метода, для которого MethodBase.IsGenericMethodDefinition имеет значение true.

Как мне вызвать метод?

1 Ответ

11 голосов
/ 02 января 2012

Вы звоните GetMethod не на тот объект.Назовите его с общим типом bound , и оно должно работать.Вот полный пример, который работает правильно:

using System;
using System.Reflection;

internal sealed class Program
{
    private static void Main(string[] args)
    {
        Type unboundGenericType = typeof(MyClass<>);
        Type boundGenericType = unboundGenericType.MakeGenericType(typeof(string));
        MethodInfo doSomethingMethod = boundGenericType.GetMethod("DoSomething");
        object instance = Activator.CreateInstance(boundGenericType);
        doSomethingMethod.Invoke(instance, new object[] { "Hello" });
    }

    private sealed class MyClass<T>
    {
        public void DoSomething(T obj)
        {
            Console.WriteLine(obj);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...