39

どうすれば自分の財産を取得できますか? 現在、 のエラーが発生Ambiguous match foundしています。コードのコメント行を参照してください。

public class MyBaseEntity
{
    public MyBaseEntity MyEntity { get; set; }
}

public class MyDerivedEntity : MyBaseEntity
{
    public new MyDerivedEntity MyEntity { get; set; }
}

private static void Main(string[] args)
{
    MyDerivedEntity myDE = new MyDerivedEntity();

    PropertyInfo propInfoSrcObj = myDE.GetType().GetProperty("MyEntity");
    //-- ERROR: Ambiguous match found
}
4

8 に答える 8

45

Type.GetProperty

AmbiguousMatchExceptionが発生する状況..。

...派生型は、新しい修飾子を使用して、同じ名前の継承されたプロパティを非表示にするプロパティを宣言します

次を実行する場合

var properties = myDE.GetType().GetProperties().Where(p => p.Name == "MyEntity");

PropertyInfo2つのオブジェクトが返されることがわかります。1MyBaseEntityつと1つMyDerivedEntity。そのため、あいまいな一致が見つかりましたというエラーが表示されます。

PropertyInfoあなたはこのようにのために得ることができますMyDerivedEntity

PropertyInfo propInfoSrcObj = myDE.GetType().GetProperties().Single(p => 
    p.Name == "MyEntity" && p.PropertyType == typeof(MyDerivedEntity));
于 2012-07-12T01:08:42.010 に答える
21

newでの宣言が原因であいまいさが生じますMyDerivedEntity。これを克服するには、LINQ を使用できます。

var type = myObject.GetType();
var colName = "MyEntity";
var all = type.GetProperties().Where(x => x.Name == colName);
var info = all.FirstOrDefault(x => x.DeclaringType == type) ?? all.First();

これにより、派生型が存在する場合はそのプロパティが取得され、存在しない場合はベースが取得されます。これは、必要に応じて簡単にフリップフロップできます。

于 2015-11-02T16:11:49.163 に答える
0

LocationKey オブジェクトの MsgPack シリアル化でこの問題が発生していました。LocationKey クラスで定義した演算子になりました。これらの演算子を両方とも定義DefaultContext.GetSerializer(obj.GetType());すると、シリアル化しようとしたときに Ambiguous Match Found がスローされました。オペレーターの 1 つのセットを削除すると、問題が解消されました。

public static bool operator ==(int key1, LocationKey key2)
{
    return key1 == key2.Value;
}

public static bool operator !=(int key1, LocationKey key2)
{
    return key1 != key2.Value;
}

public static bool operator ==(LocationKey key1, int key2)
{
    return key1.Value == key2;
}

public static bool operator !=(LocationKey key1, int key2)
{
    return key1.Value != key2;
}
于 2015-04-03T20:18:48.430 に答える