Почему нет параллели с setAccessible в Java в .NET? - PullRequest
3 голосов
/ 09 июня 2009

Взгляните на setAccessible - способ в Java, позволяющий вам вызывать частные методы с помощью отражений. Почему .NET еще не реализовал такую ​​функцию?

Ответы [ 4 ]

5 голосов
/ 09 июня 2009

Здесь - это пример выполнения в .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");
   }
 }
4 голосов
/ 09 июня 2009

Вы можете использовать рефлексию для вызова приватных методов, хотя это не так просто, как вызов публичных методов. Мы делали это раньше для модульного тестирования и использовали следующие посты в качестве справочного руководства:

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 голосов
/ 09 июня 2009

В .NET вполне возможно получить доступ ко всему частному, используя отражение.

Например, получение доступа к частному экземпляру метода Foo на панели классов будет выглядеть так:

typeof(Bar).GetMethod("Foo",BindingFlags.NonPublic | BindingFlags.Instance);

однако требуется, чтобы код, использующий отражение, был полностью доверенным.

(требования безопасности для V4 будут другими)

2 голосов
/ 09 июня 2009

Я думаю, что «почему» может быть чем-то вроде умозрительного вопроса, но если вы ищете способ тестирования частных методов, я думаю, вы сможете сделать это проще с .NET 4.0:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...