Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射从Main调用泛型方法_C# - Fatal编程技术网

C# 使用反射从Main调用泛型方法

C# 使用反射从Main调用泛型方法,c#,C#,我在玩弄反射。不确定以前是否有人提出过这种情况: static void Main(string[] args) { MethodInfo definition = typeof(SafeClass).GetMethod("Print"); MethodInfo constructed = definition.MakeGenericMethod(typeof(int)); constructed.Invoke(null, nul

我在玩弄反射。不确定以前是否有人提出过这种情况:

    static void Main(string[] args)
    {

        MethodInfo definition = typeof(SafeClass).GetMethod("Print");
        MethodInfo constructed = definition.MakeGenericMethod(typeof(int));
        constructed.Invoke(null, null);

        Console.ReadLine();
    }

public class SafeClass
{
    public void Print<T>()
    {
        Console.WriteLine(typeof(T));
    }
}
static void Main(字符串[]args)
{
MethodInfo definition=typeof(SafeClass).GetMethod(“打印”);
MethodInfo constructed=definition.MakeGenericMethod(typeof(int));
constructed.Invoke(null,null);
Console.ReadLine();
}
公共类安全类
{
公开作废印刷品()
{
控制台写入线(类型为(T));
}
}
我得到错误
非静态方法需要一个目标。


如果我将
Print
方法设为静态,则调用将通过。但是,我不确定如何从内部静态方法调用此调用。

您基本上在执行以下操作,但由于明显的原因,这些操作不起作用

null.Print<int>();

你基本上是在做下面的事情,这显然是行不通的

null.Print<int>();
Print()
是一个实例方法,而不是静态方法。它需要在某些东西上被调用

例如,代码是:

var sc = new SafeClass();
sc.Print<int>();
Print()
是一个实例方法,而不是静态方法。它需要在某些东西上被调用

例如,代码是:

var sc = new SafeClass();
sc.Print<int>();

它说它需要一些实例来完成对这个方法的调用。我也动态地创建了对象。因此,如果包含该方法,则可以运行任何对象

static void Main(string[] args)
    {
        object test=  Activator.CreateInstance(typeof(SafeClass));     
        MethodInfo definition = typeof(SafeClass).GetMethod("Print");
        MethodInfo constructed = definition.MakeGenericMethod(typeof(int));
        constructed.Invoke(test, null);
        Console.ReadLine();
    }

它说它需要一些实例来完成对这个方法的调用。我也动态地创建了对象。因此,如果包含该方法,则可以运行任何对象

static void Main(string[] args)
    {
        object test=  Activator.CreateInstance(typeof(SafeClass));     
        MethodInfo definition = typeof(SafeClass).GetMethod("Print");
        MethodInfo constructed = definition.MakeGenericMethod(typeof(int));
        constructed.Invoke(test, null);
        Console.ReadLine();
    }

如果方法是实例方法或构造函数,则Invoke的第一个参数应该是实例本身

这是因为当调用实例方法或构造函数时,clr将隐式地将实例作为第一个参数传递给函数,以便您可以在方法中使用
this


在python等其他语言中,此参数由程序员显式传递

如果方法是实例方法或构造函数,则Invoke的第一个参数应该是它自己的实例

这是因为当调用实例方法或构造函数时,clr将隐式地将实例作为第一个参数传递给函数,以便您可以在方法中使用
this

在python等其他语言中,此参数由程序员显式传递