どうすれば財産を取得できますか?現在、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
}
AmbiguousMatchExceptionが発生する状況...
...派生型は、新しい修飾子を使用して、同じ名前の継承されたプロパティを隠すプロパティを宣言します
以下を実行する場合
var properties = myDE.GetType().GetProperties().Where(p => p.Name == "MyEntity");
2つのPropertyInfo
オブジェクトが返されることがわかります。 1つはMyBaseEntity
用で、もう1つはMyDerivedEntity
用です。そのため、Ambiguous match foundエラーが表示されます。
次のようにPropertyInfo
のMyDerivedEntity
を取得できます。
PropertyInfo propInfoSrcObj = myDE.GetType().GetProperties().Single(p =>
p.Name == "MyEntity" && p.PropertyType == typeof(MyDerivedEntity));
プロパティの場合:
MemberInfo property = myDE.GetProperty(
"MyEntity",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
メソッドの場合:
MemberInfo method = typeof(String).GetMethod(
"ToString",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly,
null,
new Type[] { },// Method ToString() without parameters
null);
BindingFlags 。DeclaredOnly-指定された型の階層のレベルで宣言されたメンバーのみを考慮するように指定します。継承されたメンバーは考慮されません。
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();
これにより、派生型が存在する場合はプロパティを取得し、存在しない場合はベースを取得します。これは必要に応じて簡単にフリップフロップできます。
Kevinはすでに問題を指摘しましたが、複雑なステートメントやLINQは必要ありません。
PropertyInfo propInfoSrcObj = myDE.GetType().
GetProperty("MyEntity", typeof(MyDerivedEntity));
私はそれを検索するブラウザコンソールでこのエラーを取得しましたが、この例外はc#用であり、答えはc#用でもあることがわかりました。その後、コードを見て、問題が発生する場所を見つけました:
私はajax postメソッドを持っていますが、データを投稿するとこのエラーが発生したため、渡したデータはc#webメソッドによって収集されます。そのモデルを見ると同じ名前の2つのプロパティがあるので、1つと問題と例外を削除します解決しました。
私にとっては、VB.Netで、JSオブジェクトを<WebMethod()>
関数に渡すときに、この説明的なエラーが発生しました。
私のオブジェクトは、他のエンティティへの参照を含むEFエンティティで構成されていました。これらの参照プロパティを何も設定しないと、これは解決しました。なぜこれがJSに送信するためにシリアライズするときに循環参照を引き起こさなかったのか分かりませんが、それはあります。
LocationKeyオブジェクトのMsgPackシリアル化でこの問題が発生していました。 LocationKeyクラスで定義した演算子になりました。これらの演算子の両方を定義すると、DefaultContext.GetSerializer(obj.GetType());
がシリアライズしようとしたときにAmbiguous Match Foundをスローしました。オペレーターのセットを削除すると、問題はなくなりました。
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;
}