【问题标题】:How to use a variable as type如何使用变量作为类型
【发布时间】:2012-09-29 10:56:14
【问题描述】:

我想将 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);

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

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

【问题讨论】:

    标签: c# wcf transfer


    【解决方案1】:

    如果您事先不知道类型,那么您目前不能在 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(),也许还有一些反思 - 它是仍然是 generic,即使它不使用 generics

    【讨论】:

    • 是的,我要说的是:我可以发送一个包含类型名称的附加字符串,然后将此字符串信息用作对象的类型吗?
    • @Offler 如果你使用BinaryFormatter,对象已经知道它的类型。对于像XmlSerializer 这样的序列化程序,它不会 - Type.GetType(string) 是你最好的选择,但你需要存储.AssemblyQualifiedName,而不仅仅是.FullName(否则它不会知道要查看什么程序集在)。但是,您不能将其设为 variable 类型;这只是给你一个Type 在运行时使用;例如Type type = GetAndParseTheType(); var ser = new XmlSerializer(type); var obj = ser.Deserialize(stream);
    • 好的,我会玩一下看看它是如何工作的。我想我需要像 aObjType = aObj.GetTypeFromName("ThisisMyType"); MethodInfo aMethod = aObjType.GetMethod("persist"); aMethod.Invoke(aObj, new object[0]);
    • @Offler 第一个是Type type = Type.GetType(string);第二个是type.GetMethod("Persist"),但是,使用接口或dynamic 可能会更容易并且更有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多