在运行时使用“对象”包含的基础类型的扩展方法

时间:2015-02-20 00:08:04

标签: c# extension-methods object-type

我问了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(在运行时验证)。

有没有办法让这项工作(使用扩展方法)?它只是代码语义,还是在没有在设计时将其转换为“对象”时是不可能的?

1 个答案:

答案 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;
}