2012-04-18 5 views
3

私はUmbraco 4.7.1で作業していますが、コンテンツノードをいくつかの自動生成された強力な型付きオブジェクトにマップしようとしています。私は、valueinjecterとautomapperの両方を使ってみましたが、どちらも自分のプロパティをマップしていません。umbracノードとstrongtypedオブジェクトのマッピング

node.GetProperty("propertyName").Value; 

そして、私の厳密に型指定されたオブジェクトがMyObject.PropertyNameの形式である:私はUmbracoノード(CMS文書)上のすべてのプロパティは次のように取得されるので、それがあると思います。では、メソッドと小文字で始まる文字列を使用して取得されたノードのプロパティを、MyObjectのプロパティに大文字で始まるプロパティにマップするにはどうすればよいですか?

UPDATE 私は強くプロパティを入力する文字列プロパティをキャストする方法についていくつかのインスピレーションのためのUmbracoのソースコードの中を掘って、意図したとおりumbracoノードをマッピングし、次のコードを作成するために管理:

public class UmbracoInjection : SmartConventionInjection 
{ 
    protected override bool Match(SmartConventionInfo c) 
    { 
     return c.SourceProp.Name == c.TargetProp.Name; 
    } 

    protected override void Inject(object source, object target) 
    { 
     if (source != null && target != null) 
     { 

      Node node = source as Node; 

      var props = target.GetProps(); 
      var properties = node.Properties; 

      for (int i = 0; i < props.Count; i++) 
      { 
       var targetProperty = props[i]; 
       var sourceProperty = properties[targetProperty.Name]; 
       if (sourceProperty != null && !string.IsNullOrWhiteSpace(sourceProperty.Value)) 
       { 
        var value = sourceProperty.Value; 
        var type = targetProperty.PropertyType; 
        if (targetProperty.PropertyType.IsValueType && targetProperty.PropertyType.GetGenericArguments().Length > 0 && typeof(Nullable<>).IsAssignableFrom(targetProperty.PropertyType.GetGenericTypeDefinition())) 
        { 
         type = type.GetGenericArguments()[0]; 
        } 
        targetProperty.SetValue(target, Convert.ChangeType(value, type)); 
       } 
      } 
     } 
    } 
} 

ご覧のとおり、私はSmartConventionInjectionを使って物事をスピードアップしています。 16000オブジェクトのようなものをマップするのに約20秒かかります。これはもっと早くすることができますか?

感謝ValueInjecterと

トーマス

答えて

3

あなたはこのようなものだろう:

public class Um : ValueInjection 
{ 
    protected override void Inject(object source, object target) 
    { 
     var node = target as Node; 
     var props = source.GetProps(); 
     for (int i = 0; i < props.Count; i++) 
     { 
      var prop = props[i]; 
      target.GetProperty(prop.Name).Value; 

     } 
    } 
} 
+0

感謝を。ターゲット上の値を設定しようとすると、「System.String」タイプのオブジェクトを「System.Nullable'1 [System.Int32]」に変換できないというエラーが表示されます。どんな助けもありがとうございます。ありがとう – ThomasD

+0

私はコード全体を投稿しませんでしたが、基本的にメッセージが示唆しているのは、文字列プロパティをintで設定しようとしているということですか?値を指定すると、target.GetProperty(prop.Name)を実行することによって、名前だけでプロパティを照合していることがわかりますが、タイプや何かをチェックしないので、同じものであれば名前は異なっていますが – Omu

+0

こんにちは。プロパティの名前は一意であり、ソースノードのすべての値は文字列として格納されます。ソースプロパティを正しいターゲットプロパティタイプにキャストするにはどうすればよいですか?私はすべてのこのようなリフレクションのものには新しいので、簡単な質問であるかもしれないことについては残念です – ThomasD

関連する問題