2011-08-18 57 views
3

在我的場景中,我有兩種類型的對象。 A 計劃。每個人共享一定的價值,而層級有3個額外的價值(比率,最低和最高)。在C#中使用泛型有條件地進行比較

我想提出一個通用的方法來有條件地評估新的對象是否可以被寫入到數據庫中,基於以下條件:

創作:

  1. 一個級別:((o1.Rate!=o2.Rate) || ((o1.Start!=o2.Start) && (o1.End!=o2.End))) && (MinVal && MaxVal)
  2. A等級或計劃:(o1.Name!=o2.Name)
  3. 等級或計劃:只有一個可以有(Active == true),其餘必須是假的。

是否有可能爲這樣的事情創建一個通用方法?如果是這樣,有沒有這樣的例子?還是有人有建議?

謝謝!

更多: 所以我有對象的列表,我需要一個新創建的一個比較與數據庫中的互相對象之前,我確實把它寫入數據庫。

+0

看起來不太合適,除非我在你的問題中錯過了一些基本簡單的東西。 – Yuck

+2

您想要製作一種方法來*比較*這些對象中的兩個,或者*創建這些對象中的兩個?我真的不明白你想要在這裏實現什麼... – Ryan

+2

這聽起來像一個有趣的問題,但我(可能還有其他人)發現很難辨別你在問什麼,你的例子很難遵循。可以添加一個你希望你的客戶端代碼看起來像什麼的樣本? –

回答

2

爲了這個工作,一般的方法(或類型)需要,允許它來了解所有您列出了各個屬性的約束(RateDateMinValMaxValueStart,並End)。

如果您擔心的所有類型都來自相同的基類或接口,則不需要泛型 - 只需構建一個接受該基類型的兩個參數的方法即可。

但是,如果他們不這樣做,那麼仿製藥在這裏可能不太合適 - 但是,還有另一種選擇。您可以使用dynamic來使用運行時綁定有效地使用這些屬性。只要認識到,如果你傳遞一個沒有這些屬性的參數,它將在運行時上失敗

+0

是否提供了我添加的信息解釋了我的想法更好? – Cody

+0

@醫生奧利奧:有點。我在上面寫的應用在這種情況下... –

+0

進一步添加,這是使用實體框架 - 創建的對象是以TblPlan/TblTier的形式,因此它不會從基類繼承。 – Cody

0

也許是這樣的:

// I'm making up the types here; modify to match your actual types 
public interface IMyObject { 
    public int Rate { get; set; } 
    public DateTime Date { get; set; } 
    public int MinVal { get; set; } 
    public int MaxVal { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

public static class MyObjectFactory { 
    public static T Create<T>(int rate, DateTime date, /* etc.. */) 
      where T : IMyObject, new() { 

     if (/* tests */) { 
      throw new MyObjectException("Constraint violated ..."); 
     }    

     T obj = new T(); 

     obj.Rate = rate; 
     obj.Date = date; 
     // etc .... 

     return obj; 
    } 
} 

然後你可以使用它像這樣:

public class SomeMyObject : IMyObject { 
    // implementation omitted for brevity ... 
} 

// somewhere: 
SomeMyObject obj = MyObjectFactory.Create<SomeMyObject>(rate, date, /* etc. */); 

是你問什麼?

+0

好吧,如果你看看我編輯過的帖子,你會發現我提到,雖然一個計劃和層級共享4個值,而層級有3個額外的值。 – Cody

0

您的選項基本上都是:

  1. 使用這些道具一種常見的遺傳基礎對象
  2. 實現與這些道具的接口
  3. 使用反射來獲取的值,並比較他們,如果對象是真的無關的,或者如果你只知道運行時比較的字段值。

蘆葦下面提到的動態對象 - 可能工作我不得不相信他的答案,但包括動態需求。

1

我真的不知道問題是什麼......但如果所有這些都是在數據庫中創建之前進行某種「預檢」,我通常會訴諸數據庫中的存儲過程,爲創建和返回主鍵或錯誤代碼失敗的參數...在成功的情況下,然後加載主鍵從數據庫創建的對象...

數據庫通常是非常有效的這種比較 - 如果我需要並行運行程序的多個實例和/或獨立於不同程序創建對象,數據庫解決方案會照顧它...

編輯 - 作爲根據註釋/請求:
我通常與Oracle工作,所以我沒有在任何一方面SQL Server存儲過程......但這些鏈接應該提供一些見解:

+0

所以你說我可以爲SQL服務器編寫一個存儲過程,與用戶進行通信,讓他們知道它們的值已經存在? – Cody

+0

基本上是 - 存儲過程傳回新的主鍵(=創建對象時的成功),錯誤代碼(=由於對象的存在而失敗)/可選地存在用於已存在的「重複對象」的現有主鍵...你的程序然後通信這個無論如何你想要回到用戶... – Yahia

+0

你知道任何這樣的事情,我可以合作的例子嗎?我不太瞭解存儲過程。 – Cody