[英]How to invoke a non static method by reflection
我正在嘗試了解反射 C#,特別是在我的程序中加載第三方 dll。 我創建了一個簡單的dll:
namespace testclass
{
public class Class1
{
private string f;
public string f1 { get; set; }
}
public class Class2
{
public static int f2 = 0;
public static string f1 { get; set; }
static Class2()
{
Console.WriteLine("1st string");
}
public void runme()
{
Console.WriteLine("2nd string");
}
}
}
並將其加載到我的程序中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
class program
{
static void Main()
{
Assembly assembly;
assembly = Assembly.LoadFrom(@"D:\user\ClassLibrary1.dll");
var exporttypes = assembly.GetExportedTypes();
foreach (var types in exporttypes)
{
var fields = types.GetFields();
foreach (var fi in fields)
{
if (fi.Name == "f2")
{
fi.SetValue(exporttypes, 2);
}
}
var m1 = types.GetMethods();
for (int i = 0; i < m1.Length; i++)
{
if (m1[i].Name == "runme")
{
m1[i].Invoke(types, null);
}
}
}
Console.ReadKey();
}
}
問題是當您嘗試調用方法 'runme' 時,如果 'runme' 不是靜態的,編譯器會給出異常。 我想明白,在這種情況下,您需要作為第一個參數傳遞來調用
要使用反射調用非靜態方法,您必須創建該類型的實例並將其作為第一個參數傳遞給Invoke
。
所以就你的代碼而言,這可能是
if (m1[i].Name == "runme")
{
var inst = Activator.CreateInstance(types);
m1[i].Invoke(inst, null);
}
請注意,這只會起作用,因為該類型具有無參數構造函數,並且是從類型創建實例的最基本方法,還有許多其他方法。
你需要創建一個對象的實例來調用它的非靜態方法:
// Only works if there's a default ctor:
var instance = Activator.CreateInstance(types);
然后將實例傳遞給您嘗試調用的非靜態方法:
m1[i].Invoke(instance, null);
注意:例如,您的變量types
應該是單數的: theType
。
您需要創建一個實例。
我相信語法是
var instance = Activator.CreateInstance(types).
m1[i].Invoke(instance, null);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.