【问题标题】:How do you call a generic method if you only know the type parameter at runtime?如果在运行时只知道类型参数,如何调用泛型方法?
【发布时间】:2012-05-03 14:01:26
【问题描述】:

我有这个方法:

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

所以我想称之为SomeMethod,如果我知道类型就可以了:

SomeMethod<Class1>();

但如果我在运行时只有Class1,我就无法调用它?

那么如何用未知的T类型调用SomeMethod?我通过反射得到了 Type。

我有类型的类型,但SomeMethod&lt;Type | GetType()&gt; 不起作用。

7 月更新。5 月:

这是我想要实现的示例代码:

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 };
        }
    }
}

这是一个从更大的背景中取出的演示。

【问题讨论】:

  • SLaks 很好地回答了您的问题。我只是提醒您,您在这里误用了anonymous 这个词,这意味着不同的东西。在您的情况下, T 是通用的。
  • 这是您的 API 调用还是第三方 API?如果它是你的,那么考虑改变它,因为泛型不能解决问题,而是在这种情况下创建它。
  • 这个想法是 - 我想调用 SomeMethod - 通常我会像 SomeMethod();但我只知道我要使用的类是“Class1”或其他类的字符串。

标签: c# generics reflection


【解决方案1】:

你需要使用反射来调用它:

var method = typeof(SomeClass).GetMethod("SomeMethod");
method.MakeGenericMethod(someType).Invoke(...);

【讨论】:

  • 这不是调用未知方法,而是调用我直到运行时才知道的参数。例如。如果是 Class1 或 Class2 等。
  • SLaks 和六个字母变量让我朝着正确的方向前进。谢谢大家!
【解决方案2】:

您可以在 C# 4 中使用 dynamic 关键字。您还需要 .NET 4.0 或更高版本。:

SomeMethod((dynamic)obj);

运行时推断实际类型参数并进行调用。如果obj 为空,则它会失败,因为那时就没有类型信息了。 C# 中的 null 没有类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多