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 DoInvocationsDataContainer 中获取有关 [=49= 的某些程序集信息] Execute。为了能够从此 class.

调用方法

所以在我得到程序集信息后,在 class DoInvocations.

中成功调用了请求的方法
invokeInformation.InvokeMember(
                DataContainer.MethodName,
                BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
                null, null, inputParamList);

MethodNameDataContainerpublic 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,
            ...);