2016-04-14 10 views
2

アドレスオブジェクトを含むいくつかのビューモデルがあります。そのアドレスオブジェクトには、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)); 

...私は、オブジェクトを見つけることができたが、その後、私は動けなくです:

  1. 入ってくるのViewModel(MVC)が持っているかどうかを確認しますアドレスオブジェクトまたは のアドレスプロパティを持っています。

  2. アドレスオブジェクトを持っている場合は、アドレスプロパティを取得します。それ以外の場合は、ViewModelからアドレスプロパティを取得します。

+0

プロパティが存在するかどうかをチェックするだけでなく、それを取得するだけでなく、 'Any'呼び出しを' SingleOrDefault'呼び出しと交換する方法はありますか? – thehennyy

+0

これは非常に古いコード100+ビューモデルなどであり、深くリファクタリングすることはできません。 :(残念なことに、私はジェネリックスについて深い知識は持っていませんが、速度を上げるために試してみてください。どちらにしても、ジェネリックでもオブジェクトアドレスを取得して値を解析する必要があります。 。 –

+0

プロセスを簡略化するためにインターフェイスを使用する人は誰かから言われました。以下の回答を適用した後、私はさまざまな痛みにぶち当たったので、以下の答えでそれらを組み合わせて、私のインターフェイスにはすべてのクラスと検証コードが必要なプロパティがあり、勝者は複雑なコードなどで重複した重大なものを削除することができたのです..ポインタの方々に感謝します –

答えて

2

私は、オブジェクトのプロパティを確認するために使用する1つの素敵な拡張メソッドがあります:そのnullは、[アドレスを取得する場合

var addressObject = model 
    .ToDictionary() 
    .FirstOrDefault(x => x.Value is EntityAddressVM) 
    .Value; 

/// <summary> 
///  Gets all public properties of an object and and puts them into dictionary. 
/// </summary> 
public static IDictionary<string, object> ToDictionary(this object instance) 
{ 
    if (instance == null) 
     throw new NullReferenceException(); 

    // if an object is dynamic it will convert to IDictionary<string, object> 
    var result = instance as IDictionary<string, object>; 
    if (result != null) 
     return result; 

    return instance.GetType() 
     .GetProperties() 
     .ToDictionary(x => x.Name, x => x.GetValue(instance)); 
} 

次に、あなたがこのような何かを行うことができますモデルからのプロパティ。

これが役に立ちます。

+0

メソッド 'ToDictionary' 0個の引数を持ちますが、2個の引数で呼び出されます。 –

+0

'.cs'ファイルの最上部に' using System.Linq; 'を追加します –

+0

linqが追加され、コードが少し変更されました....テスト中... return instance.GetType() .GetProperties() .ToDictionary(x => x.Name、x => x.GetValue(instance、null)); –

関連する問題