【发布时间】:2016-02-05 19:14:00
【问题描述】:
我有一个控制器,上面有一些动作,其中一些可能有自定义属性。我想使用 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 上遇到错误 - 方法的类型参数...无法从用法中推断出来。
【问题讨论】:
-
您是否尝试过使用 Select 而不是 SelectMany?每个类型都不是一个集合是吗?
-
myControllerList 是一个集合,对于每个控制器,可能有多个具有自定义属性的方法,所以如果这有意义的话,我需要为控制器中的每个方法创建一个项目? @ChrisWohlert
-
我想这是有道理的,但是在您的示例代码中,您并没有尝试返回所有属性,而只是返回第一个属性。如果 Rui 的回答不是你想要的,我会很惊讶。如果是,您应该接受它作为答案。 :)