C# Linq表达式,以返回第一个采用1个字符串参数的重载方法
我将使用哪个Linq表达式来选择接受单个字符串参数的1rst重载方法 例如,返回DateTime.ToString(字符串格式),而不是DateTime.ToString(IFormatProvider) 大概是这样的:C# Linq表达式,以返回第一个采用1个字符串参数的重载方法,c#,linq,reflection,C#,Linq,Reflection,我将使用哪个Linq表达式来选择接受单个字符串参数的1rst重载方法 例如,返回DateTime.ToString(字符串格式),而不是DateTime.ToString(IFormatProvider) 大概是这样的: var match = (from method in type.GetMethods() where validMethods.Contains(method.Name) let parameters = method.Ge
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)
{
...
}
通常情况下,一个字符串参数不能有多个方法,但如果您查看的是一个派生类,它隐藏了一个具有正确参数列表和名称的基类方法,则可能会出现这种情况。在这一点上,我认为没有指定您将首先使用哪种方法…您可以使用
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();
我本想在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();
仍然会使我的大脑受到伤害,但没有那么严重。我喜欢它,它可以很好地扩展到更多的参数类型进行检查。谢谢,我可以看到这将如何允许其他参数序列。
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();