如何将变量用作类型

时间:2012-10-09 06:59:30

标签: c# wcf transfer

我想将BusinessObjects从一台PC转移到另一台PC。如果我想到大约40种不同的对象类型要转移,那么对于不同的对象使用许多合同似乎总是相同的任务有一些重载:“将对象A发送到计算机B并将对象保存到数据库”(对象都有持久的方法)。

由于Objects可以有许多不同的类型,我只想使用泛型方法:

  1. 序列化BO对象
  2. 将其转移到另一台PC
  3. 使用正确的类型
  4. 反序列化它
  5. 进行一致性检查
  6. 保存到db
  7. 是我的问题。
  8. 目前我正在考虑将该类型作为eytra信息发送。 然后我想做点什么:

    BinaryFormatter aFormatter = new BinaryFormatter();
    aFormatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
    Object.ParseTypeFromString(aObjektType) aObject = aFormatter.Deserialize(stream) as Object.ParseTypeFromString(aObjektType);
    

    然后只使用基础对象中的泛型方法将对象保存到数据库,以使传输类尽可能简单。

    是否有可能做这样的事情?或者我是在一个完全错误的方向,用另一种方法更容易实现这个任务?

1 个答案:

答案 0 :(得分:5)

如果您事先不知道类型, 不能 当前在C#中执行任何取决于类型的操作。 BinaryFormatter 使用正确的对象类型对其进行反序列化,但您的代码通常只能将对象称为.... object

object aObject = aFormatter.Deserialize(stream);

此时,您可以使用各种选项:

  • 使用通用接口/基类
  • 使用dynamicdynamic的有趣用法包括调用最合适的方法重载,并切换到通用方法)
  • 使用isasGetType()明确测试类型,以获取特殊外壳

作为中间选项的一个例子:

object aObject = aFormatter.Deserialize(stream);
GenericMagic((dynamic)aObject);
OverloadMagic((dynamic)aObject);

...

void GenericMagic<T>(T obj) // possibly some constraints here too
{
    T x = ... // now we *have* the type, but as `T`;
              // of course, you still can't do many exciting
              // things unless you add constraints
}

// the correct one of these will be chosen at runtime...
void OverloadMagic(Customer cust) {...}
void OverloadMagic(User user) {...}
void OverloadMagic(Order order) {...}

坦率地说,如果我不得不反序列化(等)一些未知的东西,我通常更喜欢保持非泛型,只使用objectGetType(),也许还有一些反射 - 它仍然是泛型,即使它不使用泛型