Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在带有FlattHierarchy标志的propType.GetMethod中找不到C继承的静态成员?_C# - Fatal编程技术网

C# 为什么在带有FlattHierarchy标志的propType.GetMethod中找不到C继承的静态成员?

C# 为什么在带有FlattHierarchy标志的propType.GetMethod中找不到C继承的静态成员?,c#,C#,我有以下街区: 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 ParseBo

我有以下街区:

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;
    }
对于以下代码,我总是将parse设置为null

public class TreeNodeArray : AParsable<TreeNodeArray>
{
    public List<TreeNodeWrapper> nodes { get; set; }
}
更新:如果有人能指出一种更好的方法,将.NETMVC中的请求体动态解析为类实例,我将不胜感激

更新2:在控制器中,它的使用方式如下:

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

var requestData = Request.ParseBody<MyRequestModel>();
requestData.selectedNodes == null;
您已经从示例代码中省略了BindingFlags.FlatterHierarchy,尽管它在标题中。这需要包含在代码中。工作版本:

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

propType是如何初始化的?我已经更新了关于使用意图的更多细节。所以把FlatHierarchy | Public | Static放在一起做了这项工作,我尝试了每种方法,分别是FlatHierarchy、Public、Static,但它们的组合似乎是最好的选择。请更新您的答案或创建新答案,以便我将其标记为已接受。谢谢大家!@bigopon我不确定我是否遵循;我的答案已经包括了所有三个标志在答案中,您声明这里的propType是类型列表,这是不正确的。它是内部类中selectedNodes属性的TreeNodeArrayMyRequestModel@bigopon啊,是的-我读错了,我的印象是代码是在TreeNodeArray上调用的,而不是在MyRequestModel上调用的。我要把那部分去掉