列出<customclass>作为List <t>发送;如何获得属性?

时间:2016-03-31 12:55:59

标签: c# visual-studio list getproperties

我有这段代码

 public class Ticket
    {
        public string strArticleID { get; set; }
        public string strArticleDescription { get; set; }
        public decimal decArticlePrice { get; set; }
        public decimal decArticleVAT { get; set; }
        public decimal decArticuleNetPrice { get; set; }
        public decimal decArticleDiscount { get; set; }
        public decimal decArticleQuantity { get; set; }

    }
    public static List<Ticket> _lstCurrentTicket = new List<Ticket>();

我想要发送到外部DLL以获取_lstCurrentTicket中的所有行来打印票证

for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            Ticket ticket = new Ticket();

            string strRefID = this.dataGridView1.Rows[i].Cells[0].Value.ToString();
            string strDescription = this.dataGridView1.Rows[i].Cells[1].Value.ToString();
            decimal decQuantity = (decimal)this.dataGridView1.Rows[i].Cells[2].Value;
            decimal decUPrice = (decimal)this.dataGridView1.Rows[i].Cells[3].Value;
            decimal decDiscount = Convert.ToDecimal(this.dataGridView1.Rows[i].Cells[4].Value.ToString().Substring(0, this.dataGridView1.Rows[i].Cells[4].Value.ToString().Length - 1));
            decimal decVAT = Convert.ToDecimal(this.dataGridView1.Rows[i].Cells[5].Value.ToString().Substring(0, this.dataGridView1.Rows[i].Cells[5].Value.ToString().Length - 1));
            decimal decGPrice = (decimal)this.dataGridView1.Rows[i].Cells[6].Value;


            ticket.strArticleID = strRefID;
            ticket.strArticleDescription = strDescription;
            ticket.decArticlePrice = decUPrice;
            ticket.decArticleVAT = decVAT;
            ticket.decArticuleNetPrice = decGPrice;
            ticket.decArticleDiscount = decDiscount;
            ticket.decArticleQuantity = decQuantity;

            _lstCurrentTicket.Add(ticket);
        }


 TicketPrinting tktPrint = new TicketPrinting ();
 //Ticket and copies
 tktPrint.PrintTicketFromList(_lstCurrentTicket, 2);

由于它是一个外部DLL,我认为在目标DLL中使用它的最简单方法是

 public void PrintTicketFromList<T>(List<T> lstArticles, short intCopies)
    {            
        foreach (var prop in lstArticles.GetType().GetProperties())
        {

            if (prop.Name == "Item")
            {
                //Copy external list to local class for printing

            }
        }...

但我被困在那里。如何迭代列表中每个原始类的每个属性和值,以便我可以复制它?如果我创建了一个断点,我可以看到字段和值被正确传递,但是我不知道如何访问它们所以我可以做类似于创建一个与原始类似的本地类并克隆列表(如果我尝试它)会说本地列表(Ticket)和传递List(T)的类型不一样。)

或者如果我在目标中创建一个确切的类并执行类似

之类的操作,我怎么能复制它
public void PrintTicketFromList(object lstArticles, short intCopies)
    {
        List<TargetDLLTicket> lst =((List<TargetDLLTicket>)lstArticles).ToList(); }

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

听起来你有一个循环依赖问题。您需要将发送到打印功能的类型移动到公共装配(新项目),然后由调用项目和打印项目引用。然后两个项目都可以访问此共享类型。

关于您的设计的说明。你开始这样做的方式可能并不好,因此你的错误。实际的打印机功能不应该对传入的类型有任何了解。一个好的经验法则是尝试使代码尽可能松散耦合。更好的想法是创建一个接口,负责写入打印机画布(或类似的东西,你没有提供你的打印机代码所以这是一个猜测),打印机功能可以调用该方法在传入的对象上。然后,打印机方法也应该只接受该接口作为参数。这基于访客模式。这是一个例子。

public interface IPrintable {
   void WriteToPrinter(PrinterCanvas canvas);
}

public class Printer {
   public void Print(IPrintable somethingToPrint) {
      var canvas = getCanvas();
      somethingToPrint.WriteToPrinter(canvas);
   }
}

答案 1 :(得分:2)

如果在任何可能的情况下,你应该尽量避免像伊戈尔那样的回答。

但如果您真的想使用反射,那么您目前不会检查该项目,而是检查项目列表。

你应该尝试类似的东西(从记忆中写下来):

public void PrintTicketFromList<T>(List<T> lstArticles, short intCopies)
{   
    foreach (var item in lstArticles)
    {
        foreach (var prop in typeof(T).GetProperties())
        {
            var value = prop.getValue(item);
        }
    }
}

答案 2 :(得分:0)

而不是List<T>创建一个接口,例如ITicket并接受List<ITicket>。只要您知道只能使用List<T>作为通用工具,就可以使用public interface ITicket { //properties and methods you want to have all implementations to contain. } public class Ticket : ITicket { } public class LastTicket :ITicket { } public void PrintTicketFromList(List<ITicket> lstArticles, short intCopies) { } 创建不必要的广泛潜在输入。使用界面可以让您不必担心具体的实现,而只需要了解您的dll所关注的内容,即合同。

您可以将接口放在两个位置之一,即两个程序集引用的另一个外部公共程序集,或者可以将接口放入具有故障单打印逻辑的程序集中。然后,您的Ticket类可以实现该接口。

这可能是一个例子:

int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;

testBlock();