2017-06-22 3 views
0

Iは、次のブロックを有する:なぜC#継承された静的メンバーがFlattenHierarchyフラグを持つpropType.GetMethodに見つからないのですか?

public abstract class AParsable<T> where T : AParsable<T> 
{ 
    public static T Parse(string input) 
    { 
     return JSON.TryParse<T>(input); 
    } 
} 

このように使用される(完全な利用を意図して編集TL; DR:要求データクラスに着信要求の本体を解析

public static T ParseBody<T>(this System.Web.HttpRequestBase request) where T: new() 
    { 
     var instance = new T(); 
     var publicProps = typeof(T).GetProperties(); 
     var stringType = typeof(string); 
     foreach (var prop in publicProps) 
     { 
      var propType = prop.PropertyType; 
      if (!prop.CanWrite) continue; 

      var input = request.Form[prop.Name]; 
      if (string.IsNullOrEmpty(input)) continue; 

      if (propType == typeof(string)) 
      { 
       prop.SetValue(instance, input, null); 
      } 
      else 
      { 
       var parse = propType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static, null, new Type[] { stringType }, null); 
       if (parse != null) // I always get null here 
       { 
        var value = parse.Invoke(null, new object[] { input }); 
        prop.SetValue(instance, value, null); 
       } 
      } 
     } 
     return instance; 
    } 

。もしそうならそれを感謝します:私は常にアップデートには、以下のコード

public class TreeNodeArray : AParsable<TreeNodeArray> 
{ 
    public List<TreeNodeWrapper> nodes { get; set; } 
} 

用としてnullを解析しますMeoneは、.NET MVCの要求本体をクラスインスタンスに動的に解析するためのより良い方法を指摘することができます。

アップデート2:それはこのように使用されるコントローラでは:(それはタイトルにありますが)

internal class MyRequestModel { 
    public TreeNodeArray selectedNodes { get; set; } 
    public bool isForAllNodes { get; set; } 
} 

var requestData = Request.ParseBody<MyRequestModel>(); 
requestData.selectedNodes == null; 
+0

propTypeはどのように初期化されますか? –

+0

私は使用意図の詳細について質問を更新しました。 – bigopon

答えて

1

あなたはあなたのサンプルコードからBindingFlags.FlattenHierarchyを省略しました。これはあなたのコードに含める必要があります。作業バージョン:

var parse = propType 
       .GetMethod("Parse", 
        BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static, 
        null, new Type[] { stringType }, null 
       ); 
+0

したがって、 'FlattenHierarchy'をまとめる| 'パブリック' | 'Static'は仕事をしましたが、私はすべてFlattenHierarchy''''''''''''''Static''のように個別に試しましたが、それらの組み合わせが行く方法だと思われます。あなたの答えを更新するか、新しいものを作成して、それを受け入れられたものとしてマークしてください。ありがとうございました! – bigopon

+0

@bigopon私は私が従うかどうかわからない。私の答えはすでにすべての3つのフラグを一緒に含んでいます – Rob

+0

答えでは、 'propType'は' List '型です。これは間違っています。内部クラス 'MyRequestModel'の' selectedNodes'プロパティの 'TreeNodeArray'です – bigopon

関連する問題