【问题标题】:Combining Dynamic Types组合动态类型
【发布时间】:2011-10-13 18:00:51
【问题描述】:

这可能是一个愚蠢的问题,但我很想知道是否有办法做到这一点。

为了简化导入大量以空格分隔的文件的过程,我想出了一个简单的方案来描述动态类型中的布局并将其扔给调用委托的解析器。

布局如下所示:

var layout = new 
{
    Code = new SDFColumn() { Start = 0, Length = 20 },
    Name = new SDFColumn() { Start = 20, Length = 3 }
    // etc
};

一切都很好。我现在处于需要导入 2 个非常大的 SDF 的情况,它们的结构 85% 相同,最后除了一些差异。

有没有办法将一个布局附加到另一个,例如:

var layoutCommon = new
{
     /* Common fields */
};

var layoutFile01 = new
{
     /* Changes for first file type */
};

var layoutFile02 = new
{
     /* Changes for the second file type */
};


var finalLayout = /* ??? */;

我意识到行不通的一件事是:

var completeLayout = { };

if(file01)
    completeLayout = { /* everything */ };
else
    completeLayout = { /* everything */ };

这显然行不通,因为所有 3 种类型根本不同。

任何想法都将不胜感激:)

【问题讨论】:

  • 使用继承怎么样?将所有公共字段放在基类中,将特定字段放在派生类中
  • @dano_ramos,我意识到可以为每个布局创建一个类,但我们的想法是避免这样做,并且只需在我需要的函数中动态定义布局的简单性它,因此我沿着这条路走。
  • 听起来确实更灵活。现在你让我感兴趣了
  • 您仍然可以拥有一个具有“标准”布局细节的通用基类。然后根据您使用的任何布局类型动态覆盖相关属性。
  • 这是一个比简单地覆盖属性更困难的问题。一个文件可能有一个标题:“姓名日期员工”,另一个可能有“猫狗鸡桌锯”。

标签: c# c#-4.0 dynamic-typing


【解决方案1】:

您是否尝试过使用dynamic 而不是var?这应该将输入延迟到运行时,因此您的潜在对象不必匹配。 var 只是任何静态类型的替代品;它实际上根本不是动态的。

【讨论】:

  • +1,谢谢。我实际上在解析器本身中使用了dynamic,以允许使用反射传递和询问布局。我失去了智能感知的优势,但无论如何布局就在我面前。但这绝对解决了问题,谢谢!
  • 是的,缺乏智能绝对是一件可悲的事情,但现在是不可避免的。我实际上做了类似这样的事情来处理一个通用的 CSV 结构,所以很高兴看到其他人有同样的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2013-07-13
  • 2020-07-29
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多