我问了question recently on the same project I'm working on,但这是关于扩展方法和对象类型的具体问题。
以下代码不起作用:
object ProcessField(byte [] buff, int position, Dictionary<int, Type> fields)
{
int field = buff[position];
position++;
// Create an instance of the specified type.
object value = Activator.CreateInstance(fields[field]);
// Call an extension method for the specified type.
value.DoSomething();
return value;
}
public static void DoSomething(this Int32 value)
{
// Do Something
}
public static void DoSomething(this Int16 value)
{
// Do something...
}
编译器给出了这个错误:
'object'不包含'DoSomething'的定义和最好的扩展方法重载'DoSomething()'在blah blah中有一些无效的参数......
似乎扩展方法在运行时没有绑定,即使基础类型是System.Int32或System.Int16(在运行时验证)。
有没有办法让这项工作(使用扩展方法)?它只是代码语义,还是在没有在设计时将其转换为“对象”时是不可能的?
答案 0 :(得分:1)
这是......呃......非常糟糕,但你可以使用dynamic
实现你想要的效果。但是不要这样做。这真的很糟糕。
object ProcessField(byte [] buff, int position, Dictionary<int, Type> fields)
{
int field = buff[position];
position++; // this line really does absolutely nothing
// dynamic is magic!
dynamic value = Activator.CreateInstance(fields[field]);
DoSomething(value);
return value;
}