0

実行時に特定のアセンブリから抽象型を取得することは可能ですか?

現在、アセンブリに次のものをロードしています。

Assembly assem = Assembly.LoadFrom("MyAssemblyName.dll");

しかし、私はこれをやりたいです:

Type t = assem.GetType("Enterprise.Shared_Party_PersonType");

私のクラスは次のように定義されています。

public abstract class Shared_Party_PersonType

しかし、タイプtはnullを返しています。

私の最終的な目標は、リフレクションを使用して抽象クラスをナビゲートし、その抽象クラスのプロパティのリストを取得することです。これは、ここで行うのと同様です。access-to-properties-of-abstract-class-with-reflection

どんな助けでも大歓迎です。

解決策:ロードしようとした抽象型を含まない、間違ったバージョンのDLLをロードしていたことが判明しました。ただし、他の具象型と同じように、リフレクションを使用して抽象型をナビゲートおよび操作できることがわかりました。またAssembly.RefelectionOnlyLoadFrom、@ Fuexのおかげで、リフレクションのみのコンテキストでアセンブリをロードする方法について学びました。

4

3 に答える 3

4

はい、インターフェースも含め、あらゆるタイプを取得できます。名前空間を含むフルネームを指定していることを確認してください。

Type t = assem.GetType("SomeNamespace.AnAbstractClassName", true);

完全な例:

using System;
using System.Reflection;

namespace SomeNs
{
    public abstract class Foo
    {

    }
}

public class Program
{
    static void Main()
    {
        var asm = Assembly.GetExecutingAssembly();
        var type = asm.GetType("SomeNs.Foo", true);
        Console.WriteLine(type);
    }
}
于 2012-08-14T19:52:59.630 に答える
1

特定の条件を満たすバインディングパスを抽出するには、抽象型のプロパティを再帰的に検査する必要があります。

Assembly.LoadFrom()タイプ情報を検査する必要がある場合は、を使用するのが最善の解決策であるため、望ましくない影響を与える可能性がありますAssembly.ReflectionOnlyLoadFrom()

だから試してみてください:

Assembly asm = Assembly.ReflectionOnlyLoadFrom("mypath");
Type t = asm.GetType("FullName");
于 2012-08-14T20:34:22.930 に答える
1

たぶんあなたのクラスは他のクラスの中で定義されています。その場合、 (ドット)+の代わりに(プラス)を使用する必要があります。.このような:

assem.GetType("OutermostNamespace.InnerNamespace.Enterprise+Shared_Party_PersonType")

ここで、は内部で定義されEnterpriseている「外部」クラスまたは構造体です。Shared_Party_PersonType

それ以外の場合は、MyAssemblyName.dllのソースコードにアクセスできますか?次にstring n = typeof(Shared_Party_PersonType).FullName、そこに何が返されるかを調べて、型名が本当にあなたが推測しているものであるかどうかを確認しようとするかもしれません。

于 2012-08-14T20:51:00.840 に答える