How to call an extension method of a dynamic type?

2019-02-16 05:14发布

I'm reading the book 'C# in Depth, 2nd Edition' of Jon Skeet. He said that we can call extension methods with dynamic arguments using two workarounds, just as

dynamic size = 5;
var numbers = Enumerable.Range(10, 10);
var error = numbers.Take(size);
var workaround1 = numbers.Take((int) size);
var workaround2 = Enumerable.Take(numbers, size);

Then he said "Both approaches will work if you want to call the extension method with the dynamic value as the implicit this value". I don't know how to achieve it.

Thanks a lot.

2条回答
唯我独甜
2楼-- · 2019-02-16 05:18

Extension method just a syntactic sugar, it will be converted as a normal method calling by c# compiler. This conversion is dependent with current syntax context (Which namespaces are imported by using statement).

Dynamic variable is process by runtime. this time, CLR cannot get enough syntax context information to deciding which extension method used. So, it is not work.

查看更多
够拽才男人
3楼-- · 2019-02-16 05:36

Like this:

dynamic numbers = Enumerable.Range(10, 10);
var firstFive = Enumerable.Take(numbers, 5);

In other words, just call it as a static method instead of as an extension method.

Or if you know an appropriate type argument you could just cast it, which I'd typically do with an extra variable:

dynamic numbers = Enumerable.Range(10, 10);
var sequence = (IEnumerable<int>) numbers;
var firstFive = sequence.Take(5);

... but if you're dealing with dynamic types, you may well not know the sequence element type, in which case the first version lets the "execution time compiler" figure it out, basically.

查看更多
登录 后发表回答