0

我正在开发一个项目,它将序列化/存储CSV文件中的对象。 (是的,我知道这不是最佳做法,但这是必须的。)我可以将属性动态应用于对象字段吗?

我试图保持我的解决方案清洁,所以我在解决方案中有多个项目,其中之一是一个库项目包含存储/序列化方法。该项目引用了CSVhelper,这是我喜欢用来执行CSV操作的第三方库。

在项目甲

foo myobject = new foo(x,y,z); 
B.WriteToCsv(myobject); 

在项目B(我的lib中,引用csvhelper)

public static WriteToCsv(foo myobject); // csvhelper would do the work 

然而,Csvhelper需要我foo的对象上设置之后才能够操作的某些属性在上面。

我试图避免在我的Foo对象类定义文件将这些属性,而不是我希望能够动态的应用项目B.内这些属性

我的问题是,是否有可能以后应用属性,动态?关键是要尽可能保持我的项目清洁,但我觉得这会让事情变得更加复杂。这是一个坏主意,还是有这个问题的通用解决方案?


要求更新,与例如:

我Foo对象的定义:

public class Foo 
{ 
    public string a; 
    public string b; 
    public int c; 
} 

CsvHelper需要在这样的字段属性:

public class Foo 
{ 
    [CsvColumn(Name = "a", FieldIndex = 1)] 
    public string a; 
    [CsvColumn(Name = "b", FieldIndex = 2)] 
    public string b; 
    [CsvColumn(Name = "c", FieldIndex = 3)] 
    public int c; 
} 

为了保持我的代码干净,我想避免在这里添加这些属性,因为我想保留与storin相关的所有代码g /序列化在我单独的库中。 (项目B)

+2

“属性”是指属性或.NET属性,例如。 '[序列化]'?如果你提供一个简短但完整的例子,那真的很有帮助。 – 2014-10-06 08:40:28

+0

@JonSkeet更新。我的意思是.NET中的属性,是的。 [XYZ] – 2014-10-06 09:15:58

回答

1

是的,没有。在你的情况 - 编号

你可以假设地动态添加属性,但这需要完全不同的反射方法。见http://msdn.microsoft.com/en-us/library/ms171819.aspx
我怀疑第三方库支持这个。

当需要灵活性时,我宁愿将类型/对象与某种配置关联。
如果需要附加一些值到对象,请考虑ConditionalWeakTable

但不幸的是,所有这些变种不能用于你的情况。

如果需要分离关注刚刚创建的DTO与正确应用的属性和使用某种类型的映射器(例如Automapper)可以轻松地转换实体。

3

您不能将像[XYZ]这样的属性插入现有编译代码,它必须在编译时出现。

类库处理此类事情的典型方法是它可能有一个重载,它接受包含元数据的数据结构,另一个重载从属性中提取元数据。如果这个类库中没有这样的重载,那么你运气不好。

可能在运行时生成后代类,如果类允许继承,在这种情况下,你可以添加你认为合适的任何属性。根据安全模型和现有类,这可能会或可能不会成为您的选择。

1

对此的常见模式是“助手”实用程序使用属性或解析器或两者的系统。 ProtoBuf就是一个很好的例子。模式是这样的;

  1. 调用者传递一个接口指针到一个Resolver方法。
  2. 帮助器函数调用解析器来输入它的处理,它可以返回关于如何处理类型的特定信息。
  3. 如果没有通过Resolver接口,或者对Resolver的调用无法提供有用的信息,则Helper会回退到属性以查看它们是否提供必要的信息。

这是一个非常整洁的系统,桥接SOLID世界和较早的基于属性的编程风格。

+0

谢谢你的例子! – 2014-10-07 09:28:25

相关问题