2017-05-05 1 views
-2

봉인 된 클래스의 내부 메서드에 액세스하려고하지만 봉인 된 클래스이므로 내부 메서드를 상속 할 수 없습니다. 내가 작업하고있는 솔루션의 백엔드 부분은 그런 식으로 설계되었습니다. 봉인 된 클래스의 내부 메서드에 액세스 C#

은 내가이 시도 클래스

public static class LocalizationsManagerExtension 
{ 
    public static string AddAppUserBasic(this LocalizationsManager objDotnet, AppUser newUser, string pword) 
    { 
     try 
     { 
      objDotnet.AddAppUserBasic(newUser, pword); 
      return "Success!"; 
     } 
     catch(Exception ex) 
     { 
      return ex.Message; 
     } 
     //return IdentityResult.Success; 
     //return System.Threading.Tasks.Task.Run(); 
     //return "Welcome to the World of DotNet....Mr. " + password; 
    } 
} 

public ActionResult UserAddNew(UserAddNewModel model) 
    { 
     if (ModelState.IsValid) 
     { 

      var user = new DataAccess.AppUser(); 
      user.Name = model.username; 
      user.Password = model.password; 
      user.DeveloperRole = model.isDeveloperRole; 
      user.AdministratorRole = model.isAdministratorRole; 
      user.TranslatorRole = model.isTranslatorRole; 
      user.IsDomainUser = model.IsDomainUser; 
      user.ManagerRole = model.isManagerRole; 
      user.State = Data.Framework.Repository.Helpers.ObjectState.Added; 

      var result = LM.AddAppUserBasic(user, user.Password); 
      if (result == "Success!") 
      { 
       ViewBag.ReturnUrl = "/Usermanagement/UserLogin"; 
       //return RedirectToAction("UserLogin", "UserManagement"); 
      } 
      else { } 
     } 


     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

하지만 행운의 확장을 사용하는이에 대한 일을 주위 발견했다. "AddAppUserBasic"을 호출 할 수 있지만 호출하는 다른 메서드에서 로컬 메서드를 호출하고 있습니다. 봉인 된 학급에있는 학생이 아닙니다.

+0

액세스 수정 자'internal'을 살펴보십시오. 어쩌면 수정 자에 대한 정보가 누락되었을 수 있습니다. [Here] (https://msdn.microsoft.com/en-us/library/7c5ka91b.aspx) –

+1

은 왜 디자이너가 내부적으로 만들 것인지 결정한 디자이너에게 물어 봅니다. 팀원들과 자신을 동기화해야합니다 –

+0

봉인 된 클래스에서 아무것도 상속받을 수 없으며 내부 메서드 만 남겨 두십시오. –

답변

0

인기있는 믿음과는 달리, 클래스의 내부 메소드에 액세스하는 방법이 있습니다. 문제는 을 사용하면 안됩니다.입니다.

이것은 특정 조건에서는 작동하지 않을 수 있지만이 예제를 사용하여 개념을 입증 할 수 있습니다. 의 내부 메서드가 봉인 클래스부터 시작하자 :

namespace ClassLibrary1 
{ 
    public sealed class SealedInternalExample 
    { 

     internal void TryAndExecuteMe (int someNumber) 
     { 
      System.Console.WriteLine("Internal method executed. Parameter: {0}", 
       someNumber); 
     } 
    } 
} 

당신은 정상 호출 규칙을 통해 SealedInternalExample.TryAndExecuteMe을 실행할 수 없습니다. 하지만 당신은 반사를 통해 수행 할 수 있습니다 : 프로그램의

namespace CallInternalExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var classInstance = new SealedInternalExample(); 
      var methods = classInstance.GetType().GetMethods(
       System.Reflection.BindingFlags.NonPublic | 
       System.Reflection.BindingFlags.Public | 
       System.Reflection.BindingFlags.Instance); 

      for (int x = 0; x < methods.Length; x++) 
       System.Console.WriteLine("{0}: {1}", x, methods[x].Name); 

      var internalMethod = methods.FirstOrDefault 
       ((m) => m.Name.Equals("TryAndExecuteMe", 
       StringComparison.InvariantCulture)); 

      internalMethod.Invoke(classInstance, new object[] { 15 }); 

     } 
    } 
} 

출력은 : 당신은 클래스 내부 메소드에 액세스해서는 안

0: TryAndExecuteMe 
1: ToString 
2: Equals 
3: GetHashCode 
4: GetType 
5: Finalize 
6: MemberwiseClone 
Internal method executed. Parameter: 15 
2

. 내부 메소드는 이유가 있기 때문에 내부 메소드입니다. 내부 메소드를 사용해야한다고 생각한다면 먼저 다른 프로그래머와 이야기하여 왜이 메소드를 내부적으로 만들 었는지 이야기하십시오. 어쩌면 실수로. 그렇지 않은 경우 대신 사용해야하는 다른 공용 메소드가 있는지 확인하십시오.

당신은 정말 정말 정말 을하는 방법을 사용하는 몇 가지 이유에 대해 원하는 당신은 당신이

당신은 그렇게 할 리플렉션을 사용하여 무슨 일을하는지 알고있는 경우 : 당신이 할 수있는

using System.Reflection; 

Type t = typeof(YourSealedClass); //get the type of your class 
YourSealedClass obj = new YourSealedClass(); //somehow get the instance of the class 

//find all non public methods 
MethodInfo[] methods = t.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance); 

//next find your method. You can use LINQ or good old loop: 
foreach(MethodInfo mi in methods) 
    if(mi.Name == "MethodYouWantToUse") 
    { 
    mi.Invoke(obj, null); 
    break; //leave the loop 
    } 

을 자세한 내용은 여기에서 호출하십시오 : https://msdn.microsoft.com/pl-pl/library/a89hcwhh(v=vs.110).aspx

간단히 말해서 - Invoke를 호출하면 메소드의 클래스 및 매개 변수 객체 (있는 경우)를 전달해야합니다.

하지만 기억하세요. 그렇게하면 일을 망칠 수 있습니다.

+0

''클래스의 내부 메소드에 접근하지 말아야하는 이유를 더 설명 할 수 있습니까? 분명히 의도가 사용 (클래스 외부)을 사용하지 않는다면 내부가 아닌 개인을 사용할 것입니까? – musefan

+0

네 말이 맞아. 더 깊은 독서 후에 나는 나의 포스트를 조금 수정해야한다. –

관련 문제