我将使用什么Linq表达式来选择接受单个字符串参数的第一个重载方法?
例如,返回DateTime.ToString(字符串格式)而不是DateTime.ToString(IFormatProvider提供程序)。
t = typeof(DateTime);
string[] validMethods = { "ToString" };
return t.GetMethods().Where(a => validMethods.Contains(a.Name) & a.GetParameters().Length == 1).ToArray();
答案 0 :(得分:9)
您可以通过SequenceEqual
来电检查整个参数列表:
t = typeof(DateTime);
string[] validMethods = { "ToString" };
Type[] parameters = { typeof(string) };
return t.GetMethods()
.Where(a => validMethods.Contains(a.Name) &&
a.GetParameters().Select(p => p.ParameterType)
.SequenceEqual(parameters)).ToArray();
答案 1 :(得分:3)
这样的事情:
var match = (from method in type.GetMethods()
where validMethods.Contains(method.Name)
let parameters = method.GetParameters()
where parameters.Length == 1
where parameters[0].ParameterType == typeof(string)
select method).FirstOrDefault();
if (match != null)
{
...
}
通常情况下, 不能使用单个字符串参数多个方法,但如果你正在查看隐藏了一个字符串参数的派生类,那么就会发生具有正确参数列表和名称的基类方法。在那一点上,我不认为它会指定你首先得到哪种方法......
答案 2 :(得分:0)
我会将此添加为对Mehrdad的优秀答案的评论,但不要认为它的格式正确...
深入嵌套的LINQ表达式让我的大脑受到伤害(可能是因为我是LINQ新手)。
这是我尝试以更易读的方式重新格式化它。
var t = typeof(DateTime);
string[] validMethods = { "ToString" };
var parameters = new[] { typeof(string) };
return t.GetMethods()
.Where
(
a => validMethods.Contains(a.Name)
&&
a.GetParameters()
.Select(p => p.ParameterType)
.SequenceEqual(parameters)
)
.ToArray();
仍然让我的大脑受伤 - 但不是那么多。