2016-12-08 3 views
2

内部クラスのリストであるオブジェクトを返す外部アセンブリの関数を使用していますが、コード内でキャストする方法が見つかりません。外部アセンブリ内のC#の別のアセンブリから内部クラスのリストをキャストできません

コード:

namespace AssemblyNamespace 
{ 
    internal class InternalClass 
    { 
     protected internal byte b; 
     protected internal int i; 
    } 

    public class PublicClass 
    { 
     public object PublicMethod() 
     { 
      return new List<InternalClass>(); 
     } 
    } 
} 

マイコード:

using AssemblyNamespace; 

static void Main() 
{ 
    PublicClass P = new PublicClass(); 
    object obj = new object(); 

    obj = P.PublicMethod(); 

    // Is it possible to cast obj? 
} 

それが反射または何か他のものを通じてOBJをキャストすることは可能ですか?私は質問C# - How to access internal class from external assemblyを見ましたが、その提案を使う方法を見つけることができませんでした。

+0

何にキャストしますか? –

+0

同じタイプの 'InternalClass'に' b'と 'i'をアクセスできます。 –

+0

私はいつもパブリック関数の戻り値として内部型を公開できないと考えましたか? "Cが公開されていない限り、クラスCを返すパブリックメソッドMを持つことはできません"、[here](https://msdn.microsoft.com/en-us/library/ms173121.aspx)ジェネリック医薬品のための抜け穴? – dlatikay

答えて

3

パブリックAPIから内部型を公開しないでください。アクセスするInternalClassオブジェクトが存在しないようにPublicMethod()から空のリストを返しています。

しかしPublicMethod(あれば)は、実際に... InternalClassオブジェクトを返します。

static void Main() 
    { 
     PublicClass P = new PublicClass(); 
     System.Collections.IList list = P.PublicMethod() as System.Collections.IList; 
     object internalObject = list[0]; 
     FieldInfo fi = internalObject.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance); 
     byte b = (byte)fi.GetValue(internalObject); 
     Console.WriteLine(b); 
    } 

上記のサンプルコード:

public class PublicClass 
{ 
    public object PublicMethod() 
    { 
     return new List<InternalClass>() { new InternalClass() { b = 10 } }; 
    } 
} 

...あなたは、このように反射によってそのフィールドにアクセスすることができましたPublicMethod()から返されたInternalClassオブジェクトのバイト "b"フィールドの値である "10"をコンソールに出力します。

+0

このソリューションは機能しました。どうもありがとうございました。 –

+0

ええ、実際の 'PublicMethod()'は実際に使用可能なオブジェクトを返します。それはちょうど私が最初からこの例を書いて、何かをそこに置くのを忘れたことです... –

関連する問題