我有一个控制器,它有一些操作,其中一些可能有自定义属性.我想使用
linq为控制器上的每个动作选择一些匿名类型的数据,例如
Controller1
Action1
[MyAttribute("Con1Action2)"]
Action2
[MyAttribute("Con1Action3")]
Action3
Controller2
Action1
[MyAttribute("Con2Action2)"]
Action2
[MyAttribute("Con2Action3")]
Action3
我希望返回以下内容:
NameSpace = "someText", Controller = "Controller1", ActionName = "Con1Action2",
NameSpace = "someText", Controller = "Controller1", ActionName = "Con1Action3",
NameSpace = "someText", Controller = "Controller2", ActionName = "Con2Action2",
NameSpace = "someText", Controller = "Controller2", ActionName = "Con2Action3"
我正在为每个动作挣扎一个SelectMany:
var controllers= myControllerList
.Where(type =>type.Namespace.StartsWith("X.") &&
type.GetMethods().Any(m => m.GetCustomAttributes(typeof(MyAttribute)).Any()))
.SelectMany(type =>
{
var actionNames = type.GetMethods().Where(m => m.GetCustomAttributes(typeof(MyAttribute)).Any()).ToList();
var actionName = (MyAttribute)actionNames[0].GetCustomAttribute(typeof(MyAttribute));
return new
{
Namespace = GetPath(type.Namespace),
ActionName= actionName.Name,
Controller = type.Name.Remove(2);
};
}).ToList();
我在SelectMany上遇到错误 – 方法的类型参数…无法从用法中推断出来.
最佳答案 “SelectMany将序列的每个元素投影到IEnumerable,并将生成的序列展平为一个序列.”
资料来源:
https://msdn.microsoft.com/en-us/library/system.linq.enumerable.selectmany(v=vs.100).aspx
你要返回一个元素:
return new
{
Namespace = GetPath(type.Namespace),
ActionName= actionName.Name,
Controller = type.Name.Remove(2);
};
你可以使用.Select
如果要从属性集合中获取展平列表,则可以使用SelectMany,例如:
projects.SelectMany(p => p.Technologies).ToList()
假设项目具有属于名为Technologies的集合的属性,该查询将返回所有项目中的所有技术.
在您的情况下,因为您需要每个控制器的操作列表,您必须返回每个控制器的操作信息列表:
var controllers= myControllerList
.Where(type =>type.Namespace.StartsWith("X.") &&
type.GetMethods().Any(m => m.GetCustomAttributes(typeof(MyAttribute)).Any()))
.SelectMany(type =>
{
var actionNames = type.GetMethods().Where(m => m.GetCustomAttributes(typeof(MyAttribute)).Any()).ToList();
return actionNames.Select(action => {
var actionName = (MyAttribute)action.GetCustomAttribute(typeof(MyAttribute));
return new
{
Namespace = GetPath(type.Namespace),
ActionName= actionName.Name,
Controller = type.Name.Remove(2);
});
});
}).ToList();