2016-03-31 9 views
1

私がそうしたいコードリストはリスト<T>として送信されます。どのようにプロパティを取得するには?

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であるので

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); 

を通じてチケットを印刷する_lstCurrentTicketのすべての行を取得するには、外部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(); } 

ような何かを行う場合

またはどのように私はそれをコピーするだろうか?

+5

「外部DLL」とは何か、なぜあなたはその '一覧'渡すことはできませんか? –

+0

この「外部DLL」が想定していることと、それが提供するインターフェイスの種類に関する情報を追加してください。 – Codor

+0

私は、物事を印刷するためのDLLを作成し、参照としてプロジェクトに追加しました。私がちょうどすれば tktPrint.PrintTicketFromList(_lstCurrentTicket、2); リスト内の要素にアクセスできないため、エラーが発生します。 – Mario

答えて

2

可能であれば、イゴールのように反射を避けるようにしてください。

しかし、実際に反射を使用する場合は、現在はアイテムを検査していませんが、アイテムのリストを検査しています。例えばインタフェース、ITicketを作成し、List<ITicket>を受け入れる

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); 
     } 
    } 
} 
+0

それはまさに私が必要としていたものでした。どうもありがとう。 – Mario

3

循環依存の問題があるようです。印刷機能に送るタイプを共通のアセンブリ(新しいプロジェクト)に移動し、呼び出すプロジェクトと印刷プロジェクトの両方で参照する必要があります。両方のプロジェクトがこの共有タイプにアクセスできます。

デザインに関するメモ。あなたがこれについてやっているやり方は、おそらくあなたの誤りから始めるのは良いことではないでしょう。実際のプリンタ関数は、渡された型について何も知っている必要はありません。経験則として、コードをできるだけ疎結合してみてください。より良いアイデアは、プリンタキャンバスへの書き込み(またはそのようなもの、プリンタコードを提供していないので推測)を作成し、プリンタ関数が着信オブジェクトに対してそのメソッドを呼び出すことができるInterfaceを作成することです。プリンタメソッドは、そのインタフェースをパラメータとしてのみ受け入れるべきです。これはVisitorパターンに基づいています。ここに例があります。

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

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

印刷方法はプロトタイプのみです。 SQLからデータを受け取り、渡す必要があるのは、SQLクエリにWHEREフィルタとして追加する文字列だけです。デザインとデータはXMLで処理されます。しかし、SQLサーバーとの接続が失われてしまった場合に備えて、リストを送信するという考え方に出くわしました(3〜4の追加プロセスでも使用されるため)。 – Mario

+2

@マリオ - データの実際の印刷から印刷するデータのデカップリングを行います。プリンターメソッドに送信されるものを標準化して、それが1つの予想されるタイプであるか、または上記のようなビジターパターンを使用します。次に、リスト関数またはSQL関数のように印刷するデータの収集を担当する複数のメソッドを持つことができますが、データをプリンタ関数の予想される型に変換するか、共通のインタフェースを実装する必要があります。 – Igor

0

代わりList<T>の:

あなたのような何か(メモリからこれを書いて)を試してみてください。ジェネリックとしてList<T>を使用すると、チケットであるものだけで作業できることがわかっているときは、不必要な幅広い潜在的な入力を作り出しています。インターフェイスを使用すると、具体的な実装について心配することなく、代わりにあなたのdllが関係するものだけを得ることができます。

両方のアセンブリが参照する別の外部共通アセンブリ、またはチケット印刷ロジックを持つアセンブリにインターフェイスを配置できる2つの場所のいずれかにインターフェイスを配置できます。これで、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) 
{ 
} 
関連する問題