Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq表达式,以返回第一个采用1个字符串参数的重载方法_C#_Linq_Reflection - Fatal编程技术网

C# Linq表达式,以返回第一个采用1个字符串参数的重载方法

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

我将使用哪个Linq表达式来选择接受单个字符串参数的1rst重载方法

例如,返回DateTime.ToString(字符串格式),而不是DateTime.ToString(IFormatProvider)

大概是这样的:

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();