2012-07-06 53 views
2

我想编译一个包含这个方法的项目;投射到原始类型并使用参数?

public void Send<T>(object o) where T : struct { 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write((T)o); 
} 

我从这种方法(工作)的启发;

public static T Cast<T>(object o) { 
    return (T)o; 
} 

BinaryWriter.Write函数支持参数的基本类型,所以我想我可以像这样使用它。但是,Visual Studio中说:“为‘System.IO.BinaryWriter.Write(布尔)’的最佳重载的方法匹配具有一些无效参数

我试图避免编写包含每一个原始类型长switch语句并为选择类型的方法添加一个参数。这是丑陋的,看起来不正确。

这是简单和优雅:

  • 发送< int>的(123);
  • 发送< bool>(true);

但为什么它不工作?什么是正确的做法呢?

+0

你想用什么来实现,你是否熟悉[序列化概念](http://msdn.microsoft.com/en-us/library/4abbf6k0(v = vs.71).aspx),也许这是你可以尝试的另一种方法。 – danielQ 2012-07-06 21:04:29

回答

3

过载分辨率在编译时间执行。所以编译器试图找到一个方法,该方法的参数是有效的* T是(在其限制内,这在这里没有帮助)。它找不到这样一种方法。假设唯一的约束是T必须是一个结构,那么只有将是有效的非泛型参数类型将是object(通过装箱)。

如果你的目的是使用基于执行时间对象的类型为准超载是合适的,你需要为使用动态类型,像这样:

public void Send(dynamic d) { 
    BinaryWriter bw = new BinaryWriter(stream); 
    bw.Write(d); 
} 

...或者使用反射来获取和执行正确的重载(这是动态类型会做的事情)。

+0

我不熟悉“动态”关键字,但它似乎工作:)我会阅读有关它,谢谢。 – 2012-07-06 21:08:08