将 Class 成员设置为函数
Set Class Member to Function
我有一个 class 仅通过反射与另一个 class 交互。我正在与之交互的这个 class 有一些委托,我正在尝试设置它们。它们的外观如下:
public class ClassThatIAmReflecting {
public delegate void OnSuccessDelegate(bool value);
public static OnSuccessDelegate OnSuccess;
public void OnClassThatIAmReflectingSuccess(bool arg) {
if(OnSuccess != null)
OnSuccess(arg);
}
}
这就是我正在尝试的:
public class MyClass {
void Init() {
Type type = Type.GetType("ClassThatIAmReflecting");
FieldInfo fieldInfo = type.GetField("OnSuccess", BindingFlags.Public | BindingFlags.Static);
fieldInfo.SetValue(null, HandleOnSuccess);
}
void HandleOnSuccess(bool value) {
// do stuff ...
}
}
我收到的错误是它无法将操作转换为对象。关于如何执行此操作的任何帮助?
您的 class 应该是:
public class MyClass
{
public void Init()
{
Type type = typeof(ClassThatIAmReflecting);
FieldInfo fieldInfo = type.GetField("OnSuccess", BindingFlags.Public | BindingFlags.Static);
var fieldType = fieldInfo.FieldType;
var methodInfo = this.GetType().GetMethod("HandleOnSuccess", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var del = Delegate.CreateDelegate(fieldType, this, methodInfo);
fieldInfo.SetValue(null, del);
//test
ClassThatIAmReflecting.OnSuccess(true);
}
private void HandleOnSuccess(bool value)
{
Console.WriteLine("Called");
}
}
我有一个 class 仅通过反射与另一个 class 交互。我正在与之交互的这个 class 有一些委托,我正在尝试设置它们。它们的外观如下:
public class ClassThatIAmReflecting {
public delegate void OnSuccessDelegate(bool value);
public static OnSuccessDelegate OnSuccess;
public void OnClassThatIAmReflectingSuccess(bool arg) {
if(OnSuccess != null)
OnSuccess(arg);
}
}
这就是我正在尝试的:
public class MyClass {
void Init() {
Type type = Type.GetType("ClassThatIAmReflecting");
FieldInfo fieldInfo = type.GetField("OnSuccess", BindingFlags.Public | BindingFlags.Static);
fieldInfo.SetValue(null, HandleOnSuccess);
}
void HandleOnSuccess(bool value) {
// do stuff ...
}
}
我收到的错误是它无法将操作转换为对象。关于如何执行此操作的任何帮助?
您的 class 应该是:
public class MyClass
{
public void Init()
{
Type type = typeof(ClassThatIAmReflecting);
FieldInfo fieldInfo = type.GetField("OnSuccess", BindingFlags.Public | BindingFlags.Static);
var fieldType = fieldInfo.FieldType;
var methodInfo = this.GetType().GetMethod("HandleOnSuccess", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var del = Delegate.CreateDelegate(fieldType, this, methodInfo);
fieldInfo.SetValue(null, del);
//test
ClassThatIAmReflecting.OnSuccess(true);
}
private void HandleOnSuccess(bool value)
{
Console.WriteLine("Called");
}
}