2015-04-20 2 views
4

Можно ли устранить эту ошибку:Создание динамического метода расширения в C#?

public static class LayoutExtensions 
{ 
    /// <summary> 
    /// Verifies if an object is DynamicNull or just has a null value. 
    /// </summary> 
    public static bool IsDynamicNull(this dynamic obj) 
    { 
     return (obj == null || obj is DynamicNull); 
    } 

Compile время

Error: The first parameter of an extension method 
     cannot be of type 'dynamic' 

ответ

3

https://stackoverflow.com/a/5311527/613130 № см

При использовании dynamic объекта, вы не можете вызвать метод расширения через «синтаксис метода расширения». Для того, чтобы понять:

int[] arr = new int[5]; 
int first1 = arr.First(); // extension method syntax, OK 
int first2 = Enumerable.First(arr); // plain syntax, OK 

Оба они в порядке, но с dynamic

dynamic arr = new int[5]; 
int first1 = arr.First(); // BOOM! 
int first2 = Enumerable.First(arr); // plain syntax, OK 

Это логично, если вы знаете, как работают dynamic объекты. A dynamic переменная/поле/... является просто переменной object переменной/полем/... (плюс атрибут), который компилятор C# знает, что следует рассматривать как dynamic. И что означает «лечение как динамическое»? Это означает, что сгенерированный код вместо использования непосредственно переменной использует отражение для поиска необходимых методов/свойств/... внутри типа объекта (поэтому в этом случае внутри типа int[]). Четкое отражение не может обойти все загруженные сборки, чтобы искать методы расширения, которые могут быть где угодно.

+0

с подходом «этот объект», что не будет работать: ошибка intellisense или времени выполнения? – Serge

+0

@Serge * Когда вы используете динамический объект, вы не можете вызвать метод расширения с помощью синтаксиса метода расширения. * Не имеет значения тип метода расширения. Если у вас есть 'dynamic b = something', вы не можете использовать ** any **' b .ExtensionMethod() ' – xanatos

+0

Что значит« Я не могу »? Я могу, я просто спрашиваю, что будет результатом!;) – Serge

2

Все классы, производные от класса объекта. Может быть, попробовать этот код

public static bool IsDynamicNull(this object obj) 
{ 
    return (obj == null || obj is DynamicNull); 
} 
+0

Да ... это круто ... но на самом деле не нужно делать «Привет» .IsDynamicNull() '... или' myInt.IsDynamicNull' ... Я хотел бы ограничить это поведение для динамических переменные ... могут быть строками, конечно ... но объявлены как динамические .... – Serge

+1

@Jacek Не будет работать ... См. https://ideone.com/HrfsF0 Вы не можете использовать прямые методы расширения на ' динамические объекты (см. (см. http://stackoverflow.com/a/5311527/613130) – xanatos

Смежные вопросы