2

InternalsVisibleToのフォローアップ。私はc# Instantiating Internal class with private constructorを見てきましたが、これは役に立ちましたが、返されたオブジェクトを内部型としてキャストしようとしています。

この問題を解決するためにリフレクションのルートを試していますが、リフレクションを使用してプライベート メソッドで内部型をインスタンス化する方法を見つけようとして苦労しています。型を取得してコンストラクターを取得し、オブジェクトを作成するところまで行くことができます。

キャストしたい型が内部型の場合、オブジェクトのキャストをどのように実行しますか?

public object InitPrivateCoreObjects(string Type)
{
    Assembly Core = Assembly.Load("Stuff.Core, Version=0.3.3881.21340, Culture=neutral, PublicKeyToken=4fe470e63e2d354e");
    Type TypeToReflect = Core.GetType("Stuff.Core.AssemblyWithIdentifer");
    object o = Activator.CreateInstance(TypeToReflect);
    MethodInfo mi = TypeToReflect.GetMethod("AssemblyWithIdentifer");
    object newObject = mi.Invoke(o,null);
    //alternatively
    //ConstructorInfo ctor = TypeToReflect.GetConstructor(new Type[]{TypeToReflect.GetType()});
    //ctor.Invoke(newObject, null);

    return newObject;
}

内部クラスの型を取得し
、コンストラクターを呼び出してその型のオブジェクトをインスタンス化できます。ただし、内部型にアクセスできないため、そこからキャストして操作することはできません。

Reflection.Emitそのタイプに基づいて新しいクラスを作成するために使用できることは理解していますが、その方法を使用する場合は、アクセスしようとしているプロジェクトの内容全体をテスト プロジェクトにコピーすることもできます。これは本当に無駄で無意味であり、他のプロジェクトからのものを投入して混乱を招く必要があり、現時点で私が行きたいルートではありません.

個々のメソッドとプロパティにアクセスする例を見たことがありますが、クラス全体をインスタンス化する例はありません。操作の順序では、アクセス修飾子が確認される前にリフレクションが発生するため、それが可能かどうかは 100% 確信が持てません。

これを行うことができますか?もしそうなら、どのように?

明確にするために、インスタンス化されたオブジェクトをテスト目的で使用したかったの[Assembly:InternalsVisibleTo("")]ですが、現在回避しているバグのために機能していませんでした。元の質問については、こちらを参照してください。

4

3 に答える 3

1

これは実際にはあなたの質問に対する直接の答えではありませんが、これは役に立つかもしれません:

ExposedObject

内部型にアクセスできず、その型と対話するのに十分と思われるパブリックインターフェイスを実装していないが、その型のメンバーの名前と署名を事前に知っている場合は、これがおそらく最良の選択です。

于 2010-08-18T15:21:07.127 に答える
1

実行時に型しかわからないことを考えると、「オブジェクトを内部型として返す」という概念は実際にはありません。メソッドのシグネチャをどのようにしたいのか考えてみてください...それを表現する方法はありません。

呼び出し元のコードが強く型付けされた方法でそれを認識している場合は、代わりにコードをジェネリックにする必要があります。

public T InitPrivateCoreObjects<T>()
{
    Type type = typeof(T);
    ...
    return (T) newObject;
}

...しかし、呼び出し元のコードがそれを認識していない場合、それは役に立ちません。

この能力が必要だと思う理由を詳しく説明していただければ、別の方法を提案することができます。

于 2010-08-18T15:18:46.377 に答える
1

Reflection.Emit を使用して、その型に基づいて新しいクラスを作成できます

そうではありません。Reflection.Emit を使用して生成されたコードは、独自の C# と同じ規則に従います。internalこれを使用して保護をバイパスすることはできません。

個々のメソッドとプロパティにアクセスする例を見てきました

それがあなたがする必要があることです: リフレクションを使用して、個々のメソッドとプロパティを検索して呼び出します。

いくつかの代替手段:

  • 内部クラスを変更して何らかのインターフェースを実装し、そのインターフェースを公開します。通常どおりインターフェイスのメソッドを呼び出します。
  • 働きなさい[InternalsVisibleTo]これが正しい方法です。
于 2010-08-18T15:19:40.667 に答える