在 C# 中创建动态扩展方法?
Creating a dynamic extension method in 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);
}
编译时间
Error: The first parameter of an extension method
cannot be of type 'dynamic'
对象 class 派生的所有 classes。也许试试这个代码
public static bool IsDynamicNull(this object obj)
{
return (obj == null || obj is DynamicNull);
}
没有。参见
当您使用 dynamic
对象时,您不能通过 "extension method syntax" 调用扩展方法。说清楚:
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
对象的工作原理,这是合乎逻辑的。 dynamic
variable/field/... 只是一个 object
variable/field/... (加上一个属性),C# 编译器知道应该将其视为 dynamic
. "treating as dynamic" 是什么意思?这意味着生成的代码不是直接使用变量,而是使用反射在对象类型中搜索所需的 methods/properties/...(因此在本例中,在 int[]
类型中)。很明显,反射不能绕过所有加载的程序集来寻找可能在任何地方的扩展方法。
是否可以解决此错误:
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);
}
编译时间
Error: The first parameter of an extension method
cannot be of type 'dynamic'
对象 class 派生的所有 classes。也许试试这个代码
public static bool IsDynamicNull(this object obj)
{
return (obj == null || obj is DynamicNull);
}
没有。参见
当您使用 dynamic
对象时,您不能通过 "extension method syntax" 调用扩展方法。说清楚:
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
对象的工作原理,这是合乎逻辑的。 dynamic
variable/field/... 只是一个 object
variable/field/... (加上一个属性),C# 编译器知道应该将其视为 dynamic
. "treating as dynamic" 是什么意思?这意味着生成的代码不是直接使用变量,而是使用反射在对象类型中搜索所需的 methods/properties/...(因此在本例中,在 int[]
类型中)。很明显,反射不能绕过所有加载的程序集来寻找可能在任何地方的扩展方法。