为什么在.NET中没有与Java的setAccessible并行?

时间:2009-06-08 20:21:44

标签: java .net reflection

看看setAccessible - Java中的一种方式,让您通过反射调用私有方法。为什么.NET还没有实现这样的功能呢?

4 个答案:

答案 0 :(得分:5)

Here是在.NET中执行此操作的示例

using System;
using System.Reflection;
using System.Collections.Generic;

public class MyClass
{
   public static void Main()
   {
        try
        {
            Console.WriteLine("TestReflect started.");
            TestReflect test = new TestReflect();
            Console.WriteLine("TestReflect ended.");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        ConsoleKeyInfo cki;
        do
        {
            Console.WriteLine("Press the 'Q' key to exit.");
            cki = Console.ReadKey(true);
        } while (cki.Key != ConsoleKey.Q);
   }
}

public class TestReflect
{
   public TestReflect()
   {
        this.GetType().GetMethod("PublicMethod").Invoke(this, null);
        this.GetType().GetMethod("PrivateMethod", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(this, null);
   }

   public void PublicMethod()
   {
        Console.WriteLine("PublicMethod called");
   }

   private void PrivateMethod()
   {
        Console.WriteLine("FTW!one1");
   }
 }

答案 1 :(得分:4)

您可以使用反射来调用私有方法,尽管它不像调用公共方法那样直接。我们之前已经完成了单元测试,并使用了以下帖子作为操作方法参考:

http://www.emadibrahim.com/2008/07/09/unit-test-private-methods-in-visual-studio/

http://johnhann.blogspot.com/2007/04/unit-testing-private-methods.html

答案 2 :(得分:2)

我认为“为什么”可能是一个推测性问题,但如果您正在寻找一种测试私有方法的方法,我认为您可以使用.NET 4.0更轻松地完成此任务:

http://bugsquash.blogspot.com/2009/05/testing-private-methods-with-c-40.html

答案 3 :(得分:2)

在.NET中很可能使用反射访问任何私有内容。

例如,在类栏上访问名为Foo的私有实例方法将如下所示:

typeof(Bar).GetMethod("Foo",BindingFlags.NonPublic | BindingFlags.Instance);
但是,它确实需要使用反射的代码完全受信任。

(V4的安全要求会有所不同)