1

これに出くわしただけです。これが私のシナリオです:

|--> BaseTypeLibrary  (contains ViewModelBase)
|--> ModelLibrary     (contains Model)
|--> Business Library (contains equality check)

 public class Model : ViewModelBase{ }

 // returns false
 bool isViewModel = (type.IsAssignableFrom(typeof(ViewModelBase)));

最初に、UI ライブラリと ModelLibrary の参照が同じ BaseTypeLibrary を指していることを確認しました。ここに私が実行するいくつかのチェックがあります。

 // false
 Console.WriteLine(type.IsAssignableFrom(typeof(ViewModelBase)));

 // true
 Console.WriteLine((type.BaseType == typeof(ViewModelBase)));

 // true
 Console.WriteLine((typeof(ViewModelBase).Module.FullyQualifiedName) == (type.BaseType.Module.FullyQualifiedName));

 //true
 Console.WriteLine(type.IsSubclassOf(typeof(ViewModelBase)));

IsAssignableFrom が失敗する理由を説明できる人はいますか?

4

1 に答える 1

2

これは、最初に を使用するときにつまずく非常に一般的な問題ですIsAssignableFrom

あなたの例では、チェックを実行するときにインスタンスと引数を逆にする必要があります。

bool isViewModel = typeof(ViewModelBase).IsAssignableFrom(type);

MSDNから:

public virtual bool IsAssignableFrom( タイプ c )

戻り値の型: System.Boolean

c と現在の Type が同じ型を表している 場合、または現在の Type が c の継承階層にある場合、または現在の Type が c が実装するインターフェイスである場合、または c がジェネリック型パラメーターであり、現在の Type が表す場合は true c の制約の 1 つ。これらの条件のいずれも true でない場合、または c が null の場合は false。

そのため、候補のベース/インターフェイス タイプでメソッドを呼び出し、メソッドの引数として候補の具象/サブタイプを使用する必要があります。

メソッドの命名方法がやや曖昧であることには同意します。

于 2013-02-25T08:08:17.747 に答える