如何使类通用以在c#

时间:2018-07-12 05:20:36

标签: c# csvhelper

我有演示代码,忽略了Extra属性。我需要使此类通用。

public class HelloFriend 
{
    public static void Main(string[] args)
    {
        var s = new StringBuilder();
        s.Append("Id,Name\r\n");
        s.Append("1,one\r\n");
        s.Append("2,two\r\n");
        using (var reader = new StringReader(s.ToString()))
        using (var csv = new CsvReader(reader))
        {
            csv.Configuration.RegisterClassMap<TestMap>();
            csv.GetRecords<Test>().ToList();
        }
    }
}

public class Test : Test1
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public abstract class Test1
{
    public decimal Extra { get; set; }
}

public class TestMap : CsvClassMap<Test>
{
    public TestMap()
    {
        AutoMap();
        Map(m => m.Extra).Ignore();
    }
}

如上面的代码所示,如​​果我需要使用不同的Test1Test2而不是Test,那么我需要编写另一个TestMap类。如何避免这种情况?如何使该类通用,以便可以传递诸如Test之类的多个类来忽略Extra属性?

4 个答案:

答案 0 :(得分:1)

class CsvClassMap<T> where T:Test1,class 
{
    //your class logic
}

答案 1 :(得分:0)

你的意思是这样吗?

import json
from networkx.readwrite import json_graph
data = json_graph.node_link_data(G[0])
with open('graph.json', 'w') as f:
    json.dump(data, f, indent=4)


` %%html
    <div id="d3-example"></div>
    <style>
    .node {stroke: #fff; stroke-width: 1.5px;}
    .link {stroke: #999; stroke-opacity: .6;}
    </style>`



 %%javascript
    require(["d3"], function(d3){
    var force = d3.layout.force().charge(-120).linkDistance(30).size([width, height]);
    var svg = d3.select("#d3-example").select("svg");
    d3.json("graph.json", function(error, graph) {
    force.nodes(graph.nodes).links(graph.links).start();
    var link = svg.selectAll(".link").data(graph.links).enter().append("line").attr("class", "link");
    var node = svg.selectAll(".node").data(graph.nodes).enter().append("circle")
    .style("fill", function(d) {
        return color(d.club);
    })
    .call(force.drag);
    });
});`

答案 2 :(得分:0)

好吧,只要您不添加更多属性或类界面保持稳定,它可能会为您提供一段时间的帮助。

此外,我建议通过添加自定义属性并使用反射来检测要忽略的属性来增强您的实现。这是一些代码,可以给您一个想法:

public class ToBeIgnoredAttribute:Attribute
{

}

public class Test
{
    public int Property1 { get; set; }

    [ToBeIgnored]
    public int Property2 { get; set; }

}
var type= typeof(Test)// or typeof(T);
type.GetProperties().ForEach(prop =>
{

            if (prop.GetCustomAttribute<ToBeIgnoredAttribute>() != null)
            {
              Console.WriteLine($"//Call Map with right overload e.g with property name string {prop.Name}"); 
            }
            else
            {
                Console.WriteLine($"{prop.Name} is not ignored");
            }
        });

答案 3 :(得分:0)

仅使用您要映射的属性,而不是使用AutoMap

public class TestMap : ClassMap<Test>
{
    public TestMap()
    {
        Map(m => m.Id);
        Map(m => m.Name);
    }
}

另一种选择是向属性添加属性。

public abstract class Test1
{
    [Ignore]
    public decimal Extra { get; set; }
}

public class TestMap : ClassMap<Test>
{
    public TestMap()
    {
        AutoMap();
    }
}