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上调用的。我要把那部分去掉