在PowerShell中调用静态通用LINQ扩展方法 [英] Calling static generic LINQ extension method in PowerShell

查看:70
本文介绍了在PowerShell中调用静态通用LINQ扩展方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个简单的符号就可以在PowerShell中调用许多LINQ方法:

One can call many LINQ methods in PowerShell with this simple notation:

[int[]] $numbers = 1..10000
[Linq.Enumerable]::Sum($numbers)

在通话中包含lambda甚至是相对简单的事情:

It is even a relatively simple matter to include a lambda in a call:

[Func[int,int]] $delegate = { $n = $args[0]; if ($n % 3) { $n } else { -$n } }
[Linq.Enumerable]::Sum($numbers, $delegate)

不过,我想知道的是如何从PowerShell调用通用 LINQ方法:甚至可能吗? 我发现这个SO问题似乎表明可以,但是我还没有确定如何将该信息应用于LINQ. (此外,由于这是旧信息,因此PS版本5很有可能采用一种更清洁的方式来实现.)

What I am wondering, though, is how to call a generic LINQ method from PowerShell: is it even possible? I found this SO question that seems to indicate one can, but I have not determined how to apply that info to LINQ. (Plus, the fact that that is old information, it is quite possible that with PS version 5 there is a cleaner way to do it.)

那么如何在PowerShell中正确调用[Linq.Enumerable]::Cast<T>(...)[Linq.Enumerable]::OfType<T>(...)?

So how could one call [Linq.Enumerable]::Cast<T>(...) or [Linq.Enumerable]::OfType<T>(...) properly in PowerShell?

2017.05.10更新

好的,因此基于@Mathias注释,让我们继续使用MakeGenericMethod.在C#中,这种咒语有效:

OK, so based on @Mathias comment, let's stick with MakeGenericMethod. In C#, this incantation works:

var ofTypeForString = typeof(System.Linq.Enumerable).GetMethod("OfType").MakeGenericMethod(typeof(string));
var stuff = new object[] { 1.2, "abc", "def" };
var results = ofTypeForString.Invoke(null, new[] { stuff });

我仍然缺少的部分是如何将typeof(System.Linq.Enumerable)转换为PowerShell.我认为其中至少有一个应该可以工作,但是它们都返回null:

The piece I am still missing is how to translate typeof(System.Linq.Enumerable) to PowerShell. I thought that at least one of these should work but they all return null:

[System.Type]::GetType("System.Linq.Enumerable")
[System.Type]::GetType("Linq.Enumerable")
[System.Type]::GetType("Enumerable")

我确定我缺少一些简单的东西;建议?

I am sure I am missing something simple; suggestions?

推荐答案

是的,当然,PetSerAl和ejohnson的评论都是正确的.由于某种原因,我只是有一个精神障碍.因此,对于那些有兴趣的人,这里是完整的解决方案:

Yes, both PetSerAl and ejohnson's comments are correct, of course; I just had a mental block for some reason. So here is the complete solution for those who may be interested:

$stringType = "".GetType() # set to your target type
$ofTypeForString =
        [Linq.Enumerable].GetMethod("OfType").MakeGenericMethod($stringType)
$stuff = @("12345", 12, "def")
# The last comma below wraps the array arg $stuff within another array
$ofTypeForString.Invoke($null, (,$stuff)) 

这篇关于在PowerShell中调用静态通用LINQ扩展方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆