5

を使用してオブジェクトを特定の型にキャストできるかどうかを確認しようとしていますIsAssignableFrom。しかし、期待した結果が得られません...ここで何か不足していますか?

//Works (= casts object)
(SomeDerivedType)factory.GetDerivedObject(); 

//Fails (= returns false)
typeof(SomeDerivedType).IsAssignableFrom(factory.GetDerivedObject().GetType()); 

編集:

上記の例は間違っているようで、私の問題をうまく反映していません。

DerivedTypeキャストされるコード内のオブジェクトがありますBaseType:

BaseType someObject = Factory.GetItem(); //Actual type is DerivedType

PropertyTypeスルーリフレクションもあります:

PropertyInfo someProperty = entity.GetType().GetProperties().First()

がofsomeObject割り当て可能(キャスト可能)かどうかを確認したいと思います。これどうやってするの?PropertyTypesomeProperty

4

4 に答える 4

7

あなたが持っているとき

 class B { }
 class D : B {} 

それから

typeof(B).IsAssignableFrom(typeof(D))   // true
typeof(D).IsAssignableFrom(typeof(B))   // false

あなたは2番目のフォームを試していると思いますが、それは完全には明確ではありません。

最も簡単な答えは、テストすることかもしれません:

 (factory.GetDerivedObject() as SomeDerivedType) != null

編集後:

知りたいのは、someObjectがSomePropertyに割り当て可能かどうかではなく、キャスト可能かどうかです

基本は次のようになります。

bool ok = someProperty.PropertyType.IsInstanceOfType(someObject);

ただし、これは継承のみを処理します。

于 2012-04-06T09:52:36.040 に答える
1

使ってみてください

if (factory.GetDerivedObject() is SomeDerivedType)
{
//do
}

また

var tmp = factory.GetDerivedObject() as SomeDerivedType;
if (tmp != null)
{
//do
}
于 2012-04-06T09:51:29.380 に答える
1

yourGetDerivedObject()はジェネリックではなく、その結果を に明示的にキャストする必要があることがわかったので、 は(極端な場合は an )の基本型を返すように定義されてSomeDerivedTypeいると想定しています。GetDerivedObjectSomeDerivedTypeobject

もしそうなら、この行:

typeof(SomeDerivedType).IsAssignableFrom(factory.GetDerivedObject().GetType());

に変換します

typeof(SomeDerivedType).IsAssignableFrom(SomeBaseType);

基本型を派生型に割り当てることはできないため、これは一般的にfalseです(明示的にキャストする必要があります。これはあなたがしたことです)。

于 2012-04-06T10:00:02.870 に答える
0

これを試して。それはうまくいくかもしれません。コンパイルするには、いくつかの小さな変更が必要になる場合があります。

TypeBuilder b1 = moduleBuilder.DefineType(factory.GetDerivedObject().GetType().Name, TypeAttributes.Public, typeof(SomeDerivedType));

typeof(SomeDerivedType).IsAssignableFrom(b1))
于 2012-04-06T10:02:53.807 に答える