Tin tốt là PowerShell v3 là tốt hơn nhiều tại ràng buộc với các phương pháp chung (và reifying chúng?) và bạn thường không phải làm bất cứ điều gì đặc biệt nhưng gọi nó như bạn sẽ là một phương pháp bình thường. Tôi không thể chỉ định tất cả các tiêu chí mà bây giờ hoạt động, nhưng trong kinh nghiệm của tôi một số tình huống với các tham số chung vẫn yêu cầu giải pháp ngay cả trong PowerShell v4 (có thể là sự tồn tại hoặc quá tải hoặc tương tự).
Tương tự, đôi khi tôi cũng gặp sự cố khi chuyển một tham số chung cho một phương thức ... ví dụ: chuyển thông số Func<T1, T2, TResult>
.
Một công việc xung quanh đó với tôi là đơn giản hơn nhiều so với MakeGenericMethod hoặc cách tiếp cận khác là chỉ cần đặt một C# wrapper lớp nhanh chóng trực tiếp trong kịch bản của tôi, và để cho C# loại bỏ tất cả các bản đồ chung ...
đây là một ví dụ về cách tiếp cận này kết thúc tốt đẹp phương pháp Enumerable.Zip
. Trong ví dụ này, lớp C# của tôi không phải là chung chung nhưng điều đó không nói đúng.
Add-Type @'
using System.Linq;
public class Zipper
{
public static object[] Zip(object[] first, object[] second)
{
return first.Zip(second, (f,s) => new { f , s}).ToArray();
}
}
'@
$a = 1..4;
[string[]]$b = "a","b","c","d";
[Zipper]::Zip($a, $b);
này tạo ra:
f s
- -
1 a
2 b
3 c
4 d
tôi chắc chắn rằng có những cách tốt hơn để PowerShell "Zip" hai mảng nhưng bạn sẽ có được ý tưởng. Thách thức thực sự mà tôi né tránh ở đây là có một tham số thứ 3 (trong lớp C#) cứng đến Zip
vì vậy tôi không phải tìm ra cách vượt qua trong đó Func<T1, T2, TResult>
(Có thể có cách PowerShell để thực hiện điều đó ?).
Xin lỗi nhưng tôi đứng theo tuyên bố của tôi - 'không thể được thực hiện * trực tiếp * trong PowerShell'. :-) Tuyệt vời làm việc xung quanh BTW ... nhưng thực sự, nhóm PowerShell cần phải sửa lỗ này. –
Đồng ý với Keith rằng sẽ rất tuyệt khi có hỗ trợ tích hợp cho điều này, nhưng vì đây là giải pháp (ngay cả khi không trực tiếp) câu trả lời này nhận được dấu tích. –
Mẫu mã dài dòng là không cần thiết để giải quyết OP, MakeGenericMethod là đủ. – JohnC