プロジェクト内のオブジェクトの状態とメソッドにキーボードでアクセスできるフレームワークがあります。ImpromptuInterfaceに大きく依存しています。これは、優れた高速で柔軟なものです。
たとえば、メソッドを呼び出すにはImpromptu.InvokeMember(myObject, methodName, castParameters)
. myObject
パブリック メンバーとプライベート メンバーに対してはうまく機能しましたが、基本クラスのプライベート メンバーを呼び出そうとすると、Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'MyType.MyMethod(Something)' is inaccessible due to its protection level
.
問題を明らかにする最も単純なコード:
public class MainClass
{
public static void Main(string[] args)
{
var type = new PublicType();
var other = new OtherType();
Console.WriteLine(Impromptu.InvokeMember(other, "Method", 2)); //works
Console.WriteLine(Impromptu.InvokeMember(type, "Method", 2)); //crash
}
}
public class PublicType : OtherType
{}
public class OtherType
{
private bool Method(object a)
{
return a != null;
}
}
なぜそのような問題があるのか を理解しており、メソッドが定義されているクラスを探して、オブジェクトをそのクラスにキャストしようとするなど、いくつかの可能な解決策を見ることができますが、それは非常に面倒です.
できれば Impromptu に厳密に基づいた簡単な解決策はありますか?