アドレスオブジェクトを含むいくつかのビューモデルがあります。そのアドレスオブジェクトには、address1、address2、city、state、およびzipがあります。
私たちは郵便番号の住所確認システムを使用しています。私はすべての開発者がアドレスオブジェクトのView Modelオブジェクトを盗聴するヘルパークラスを呼び出せるようにしたいと思います。それが見つからない場合は、ビューモデルに基本的なaddress1、address2などのプロパティがあるかどうかを確認します...どちらの場合でも、プロパティオブジェクトのアドレスまたはアドレスのプロパティのアドレス情報を取得する必要があります...C#ジェネリックオブジェクトのオブジェクトを取得する
だから私のヘルパークラスのメソッドのシグネチャは次のようになります。
public void ShowVerificationWithReflection<T>(ModelStateDictionary modelState, T viewModel) where T : AMSBaseVM
私は、次の操作を実行します。
var objType = viewModel.GetType();
List<PropertyInfo> properties = new List<PropertyInfo>();
properties.AddRange(objType.GetProperties());
foreach (PropertyInfo property in properties)
{
if (property.CanRead)
{
if (property.Name == "Address1") testAddress.Address1 = property.GetValue(viewModel, null) as string;
if (property.Name == "Address2") testAddress.Address2 = property.GetValue(viewModel, null) as string;
if (property.Name == "City") testAddress.City = property.GetValue(viewModel, null) as string;
if (property.Name == "StCd") testAddress.StateCodeId = (long)property.GetValue(viewModel, null);
if (property.Name == "Zip") testAddress.Zip = property.GetValue(viewModel, null) as string;
}
}
これは、ビューモデルの一部アドレスプロパティのために動作します。ビューモデルは、このような性質を持っている場合 は今、私がつまずいています何を検出している:
public EntityAddressVM Address { get; set; }
私はジェネリックから、そのオブジェクトを取得して、そのアドレスのプロパティを取得する必要があります。私は助けを必要としています何
bool hasEntityAddress = objType.GetProperties().Any(p => p.PropertyType == typeof(EntityAddressVM));
...私は、オブジェクトを見つけることができたが、その後、私は動けなくです:
入ってくるのViewModel(MVC)が持っているかどうかを確認しますアドレスオブジェクトまたは のアドレスプロパティを持っています。
アドレスオブジェクトを持っている場合は、アドレスプロパティを取得します。それ以外の場合は、ViewModelからアドレスプロパティを取得します。
プロパティが存在するかどうかをチェックするだけでなく、それを取得するだけでなく、 'Any'呼び出しを' SingleOrDefault'呼び出しと交換する方法はありますか? – thehennyy
これは非常に古いコード100+ビューモデルなどであり、深くリファクタリングすることはできません。 :(残念なことに、私はジェネリックスについて深い知識は持っていませんが、速度を上げるために試してみてください。どちらにしても、ジェネリックでもオブジェクトアドレスを取得して値を解析する必要があります。 。 –
プロセスを簡略化するためにインターフェイスを使用する人は誰かから言われました。以下の回答を適用した後、私はさまざまな痛みにぶち当たったので、以下の答えでそれらを組み合わせて、私のインターフェイスにはすべてのクラスと検証コードが必要なプロパティがあり、勝者は複雑なコードなどで重複した重大なものを削除することができたのです..ポインタの方々に感謝します –