C# 通过反射调用的方法无法从 public 个静态成员访问数据
C# Invoked method by reflection cant access data from public static members
我得到了三个 classes。第一个 public static class DataContainer
、第二个 public class DoInvocations
和第三个 public class Execute
。 (注意:这些只是为了便于理解的示例名称) class DoInvocations
从 DataContainer
中获取有关 [=49= 的某些程序集信息] Execute
。为了能够从此 class.
调用方法
所以在我得到程序集信息后,在 class DoInvocations
.
中成功调用了请求的方法
invokeInformation.InvokeMember(
DataContainer.MethodName,
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null, null, inputParamList);
MethodName
是 DataContainer
的 public static string prop{ get; private set; }
,因此所有其他 classes 都应该可以访问它。
现在,在 Execute
class 中,调用的方法无法访问 DataContainer
class 的 public static
成员。如果我想访问它们,它们的所有值都是 null
.
public class Execute
{
public static void DoSomething() //DoSomething is the earlier DataContainer.MethodName
{
string whatEver = DataContainer.MethodName;
}
}
whatEver
结果是null
。当我在那之后再次调用该方法时(没有将任何信息重新加载到 DataContainer
),调用再次成功。所以信息没有消失或其他什么。似乎在调用方法之后 class Execute
访问了 DataContainer
的一个空实例,但是因为 class 是 static
它已经不可能创建它的一个实例。我真的不知道我的代码中发生了什么。
我已经在 MethodName
属性中设置了一个断点,但它从未改变过。我做错了什么?
这是您所说所做的Minimal, Complete, and Verifiable example。它的工作原理与人们期望的一样。所以你需要弄清楚你做了什么 else,这会让你的申请失败。
namespace ConsoleApp3
{
using System;
using System.Reflection;
public static class DataContainer
{
public static string MethodName { get; set; }
}
public class DoInvocations
{
public void Method()
{
typeof(Execute).InvokeMember(
DataContainer.MethodName,
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null, null, null);
}
}
public class Execute
{
public static void DoSomething()
{
Console.WriteLine(DataContainer.MethodName);
}
}
class Program
{
static void Main()
{
DataContainer.MethodName = "DoSomething";
new DoInvocations().Method();
Console.ReadLine();
}
}
}
其他人在遇到相同问题时做错了一些事情:有些人期望 static
表示全局,无论 DLL 加载到哪里。事实并非如此。每次加载库时,它都会获得自己的内存。因此,请确保您所做的一切都在同一个进程中。
一般来说,拥有静态属性不是即使在同一进程中的实例之间进行通信的好方法。这就是方法参数的用途。也许您可以找到一种方法将您的方法名称实际传递给需要它的方法,这很可能会使您的问题消失。
问题是我加载了 错误的 程序集。因为我是直接从文件路径加载程序集的:
Assembly TestAssembly = Assembly.LoadFrom("...\somePath.dll");
问题是这个程序集没有被初始化,这就是为什么 属性 DataContainer.MethodName
总是返回值 null
。
所以我简单地以这种方式加载了想要的 .dll
程序集,以获得 current 初始化程序集。
Assembly TestAssembly = typeof(DataContainer).Assembly;
因为 属性 DataContainer.MethodName
被初始化了,我没有加载普通未初始化的 .dll
,它返回了预期值而不是 null
和调用成功。
Type invokeInformation = TestAssembly.GetType(...);
invokeInformation.InvokeMember(
DataContainer.MethodName,
...);
我得到了三个 classes。第一个 public static class DataContainer
、第二个 public class DoInvocations
和第三个 public class Execute
。 (注意:这些只是为了便于理解的示例名称) class DoInvocations
从 DataContainer
中获取有关 [=49= 的某些程序集信息] Execute
。为了能够从此 class.
所以在我得到程序集信息后,在 class DoInvocations
.
invokeInformation.InvokeMember(
DataContainer.MethodName,
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null, null, inputParamList);
MethodName
是 DataContainer
的 public static string prop{ get; private set; }
,因此所有其他 classes 都应该可以访问它。
现在,在 Execute
class 中,调用的方法无法访问 DataContainer
class 的 public static
成员。如果我想访问它们,它们的所有值都是 null
.
public class Execute
{
public static void DoSomething() //DoSomething is the earlier DataContainer.MethodName
{
string whatEver = DataContainer.MethodName;
}
}
whatEver
结果是null
。当我在那之后再次调用该方法时(没有将任何信息重新加载到 DataContainer
),调用再次成功。所以信息没有消失或其他什么。似乎在调用方法之后 class Execute
访问了 DataContainer
的一个空实例,但是因为 class 是 static
它已经不可能创建它的一个实例。我真的不知道我的代码中发生了什么。
我已经在 MethodName
属性中设置了一个断点,但它从未改变过。我做错了什么?
这是您所说所做的Minimal, Complete, and Verifiable example。它的工作原理与人们期望的一样。所以你需要弄清楚你做了什么 else,这会让你的申请失败。
namespace ConsoleApp3
{
using System;
using System.Reflection;
public static class DataContainer
{
public static string MethodName { get; set; }
}
public class DoInvocations
{
public void Method()
{
typeof(Execute).InvokeMember(
DataContainer.MethodName,
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
null, null, null);
}
}
public class Execute
{
public static void DoSomething()
{
Console.WriteLine(DataContainer.MethodName);
}
}
class Program
{
static void Main()
{
DataContainer.MethodName = "DoSomething";
new DoInvocations().Method();
Console.ReadLine();
}
}
}
其他人在遇到相同问题时做错了一些事情:有些人期望 static
表示全局,无论 DLL 加载到哪里。事实并非如此。每次加载库时,它都会获得自己的内存。因此,请确保您所做的一切都在同一个进程中。
一般来说,拥有静态属性不是即使在同一进程中的实例之间进行通信的好方法。这就是方法参数的用途。也许您可以找到一种方法将您的方法名称实际传递给需要它的方法,这很可能会使您的问题消失。
问题是我加载了 错误的 程序集。因为我是直接从文件路径加载程序集的:
Assembly TestAssembly = Assembly.LoadFrom("...\somePath.dll");
问题是这个程序集没有被初始化,这就是为什么 属性 DataContainer.MethodName
总是返回值 null
。
所以我简单地以这种方式加载了想要的 .dll
程序集,以获得 current 初始化程序集。
Assembly TestAssembly = typeof(DataContainer).Assembly;
因为 属性 DataContainer.MethodName
被初始化了,我没有加载普通未初始化的 .dll
,它返回了预期值而不是 null
和调用成功。
Type invokeInformation = TestAssembly.GetType(...);
invokeInformation.InvokeMember(
DataContainer.MethodName,
...);