Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# 在运行时更改访问修饰符_C#_Reflection_Access Modifiers - Fatal编程技术网

C# 在运行时更改访问修饰符

C# 在运行时更改访问修饰符,c#,reflection,access-modifiers,C#,Reflection,Access Modifiers,仅为了举例,我写了以下内容: public class MyClass { private int MyMethod() { return 1; } } 是否有任何方法可以在运行时使用反射或其他方法将MyClass::MyMethod()的访问修饰符更改为public,然后调用它?不确定是否可以修改访问说明符,但可以通过反射调用私有方法,如: MyClass instance = new MyClass(); MethodInfo yourMethod

仅为了举例,我写了以下内容:

public class MyClass
{
    private int MyMethod()
    {
        return 1;
    }
}

是否有任何方法可以在运行时使用反射或其他方法将
MyClass::MyMethod()
的访问修饰符更改为public,然后调用它?

不确定是否可以修改访问说明符,但可以通过反射调用私有方法,如:

MyClass instance = new MyClass();
MethodInfo yourMethod = instance
                            .GetType()
                            .GetMethod("MyMethod", BindingFlags.NonPublic | BindingFlags.Instance);
var returnValue = yourMethod.Invoke(instance, new object[] { });
Console.WriteLine(returnValue);

不,类就是它,您不能在运行时更改它

您可以创建一个包含成员的新类,但
MyMethod
将是公共的,但它将不再是同一个类


在任何情况下,我都想不出这样做会有什么意义。

非常确定您可以使用反射来调用该方法,而无需使用
MethodInfo.invoke
方法更改访问修饰符。您是对的,这似乎毫无意义,但我想知道如何处理这个问题。我有一个合理的预期用途。我在EF6中生成了一个DbContext,并使用一个singleton类对其进行包装。现在,我希望人们只能访问我的单例包装器,而不能访问生成的DbContext类(因为它是作为公共类生成的)。我希望能够在运行时将其设置为内部,以便其他程序集必须使用我的包装器。现在,每当我刷新代码的EF部分以覆盖公共访问修饰符时,我所做的就是手动更改它。非常感谢,它成功了。您能解释一下为什么使用
BindingFlags.Instance
?@RomanChehowsky,它是一个实例方法,请尝试使用私有静态方法,然后使用
BindingFlags.static