1

我有这段代码

 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

            }
        }...

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

或者如果我在目标中创建一个确切的类并执行类似的操作,我怎么能复制它

public void PrintTicketFromList(object lstArticles, short intCopies)
    {
        List<TargetDLLTicket> lst =((List<TargetDLLTicket>)lstArticles).ToList(); }

有什么想法吗?

4

3 回答 3

3

听起来你有一个循环依赖问题。您需要将发送到打印函数的类型移动到一个公共程序集(新项目),然后调用项目和您的打印项目都引用该程序集。然后两个项目都可以访问这个共享类型。

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

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

public class Printer {
   public void Print(IPrintable somethingToPrint) {
      var canvas = getCanvas();
      somethingToPrint.WriteToPrinter(canvas);
   }
}
于 2016-03-31T13:23:01.013 回答
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);
        }
    }
}
于 2016-03-31T13:27:50.560 回答
0

而不是List<T>创建一个接口,例如 ITicket 和 accept List<ITicket>List<T>每当您知道只能使用 Ticket 时,将其用作泛型会创建不必要的广泛潜在输入。使用接口可以让您不必担心具体的实现,而只需了解您的 dll 所关心的合同。

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

这可能看起来像一个例子:

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)
{
}
于 2016-03-31T13:30:58.073 回答