5

我想将 BusinessObjects 从一台 PC 转移到另一台 PC。如果我考虑使用大约 40 种不同的对象类型来转移对不同对象的许多合同的使用,对于总是相同的任务来说似乎是相当多的过载:“将对象 A 发送到计算机 B 并将对象保存到 DB”(对象都有一个持久化方法)。

由于对象可以有许多不同的类型,我只想使用通用方法来:

  1. 序列化一个 BO 对象
  2. 将其转移到另一台 PC
  3. 用正确的类型反序列化它
  4. 进行一致性检查
  5. 保存到数据库
  6. 是我的问题。

目前我正在考虑将类型作为 eytra 信息发送。然后我想做类似的事情:

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

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

有没有可能做这样的事情?还是我走错了方向,用另一种方法更容易完成这项任务?

4

1 回答 1

5

如果您事先不知道类型,那么您目前无法在 C# 中执行任何取决于类型的操作。已经BinaryFormatter使用正确的对象类型对其进行反序列化,但是您的代码通常可以将对象称为.... :object

object aObject = aFormatter.Deserialize(stream);

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

  • 使用通用接口/基类
  • 使用dynamic(有趣的用途dynamic包括调用最合适的方法重载,并切换到泛型方法)
  • is使用,as或,显式测试类型以GetType()用于特殊情况

作为中间选项的示例:

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) {...}

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

于 2012-10-09T07:11:13.647 回答