2017-05-05 17 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

あなたはそうです。いくつかの深い読書の後、少し私のポストを変更する必要があります。 –

関連する問題