2014-07-03 23 views
-1

我想創建一個通用的保存方法,它應該像這樣工作;通用方法和這個

Entity.User.User user = new Entity.User.User(); 
user.FirstName = "A"; 
user.LastName = "B"; 
user.UserName = "C"; 
user.Save(); 

public class User : BaseClass<User> 
{ 
    public virtual int UserId { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual string Password { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 

    //I WANT THIS METHOD TO BE GENERIC UNDER BASE CLASS 
    //public void Save() 
    //{ 
    // CREATE.New(this); 
    //} 
} 

public partial class BaseClass<T> 
{ 
    public void Save(this T x) 
    { 
     CREATE<T>.New(x); 
    } 
} 

public class CREATE<T> 
{ 
    public static void New(T x) 
    { 
     //some code 
    } 
} 

,但我得到的錯誤

尋找一個指導來管理這項工作「擴展方法必須在非泛型靜態類中定義」。謝謝

+2

擴展方法也不能是虛擬的;你在做什麼?如果這是一個基類,'this'只是規則的'this' - 不需要'this T x';只是'CREATE 。新(this)'。 '創建'是一個可怕的名字,順便說一句。 –

+1

對不起,但這不是一個循環引用?'公共類用戶:BaseClass ' – Hinek

+0

我修復了虛擬。已更新 – Mert

回答

1

有了您的通用方法,我覺得是什麼後:

public partial class BaseClass<T> 
{ 
    public virtual void Save() 
    { 
     // only support the T : BaseClass<T> scenario, so 
     // we expect "this" to be a T 
     CREATE<T>.New((T)(object)this); 
    } 
} 
+0

我試過你的解決方案,它工作。我也沒有失去通用功能看起來更好的解決方案。謝謝,我是泛型新手,所以需要時間來充分理解我。謝謝 – Mert

0

您需要創建類更改爲:

public static class CREATE 
{ 
    public static void New<T>(this T x) 
    { 
     //some code 
    } 
} 

那是你的擴展方法,他們需要在一個靜態的非通用類。就像指出的錯誤一樣。

而且你需要在Save方法更改爲:

public void Save(T x) 
{ 
    x.Save(); 
} 

這將調用擴展名保存方法。由於基類是通用的且非靜態的,因此它不能包含擴展方法。

+0

他應該改變保存方法爲:'公共無效保存(){創建。新(this); }' – Hinek

+0

加上這個新建立的錯誤;擴展方法必須在非泛型靜態類中定義,並且從CREATE 中刪除會導致此錯誤;無法找到類型或命名空間名稱'T'(您是否缺少使用指令或程序集引用?) – Mert

3

要與所有「實體」共享Save方法,您不需要通用父類,也不需要擴展方法。

它只是一個簡單的繼承:

public class User : BaseClass 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class BaseClass 
{ 
    public void Save() 
    { 
     //put save logic here. Should match for all 
     //concrete implementations of BaseClass 
    } 
} 

現在你簡單的可以調用

User user = new User(); 
user.FirstName = "A"; 
user.LastName = "B"; 
user.UserName = "C"; 
user.Save(); 

通常你想在你的繼承樹的每個類保存它自己的屬性,然後調用父的save(),所以你不必一遍又一遍地重複你的自我。

具體的實現實際上還要考慮你如何節省。如果它只是一個序列化,你可以在BaseClass上使用一個全局保存方法,孩子們不需要在save()上提供任何實現。


即建立一個字符串,你可以做這樣的事情:所以每類只提供它負責的部分:

public class User : BaseClass 
{ 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public override String Save(){ 
     s = base.Save(); //recall base.Save() as long as its not the topmost-entity 
     //attach Username, password, firstname, lastname 
     return s; 
    } 
} 

public class BaseClass 
{ 
    public int Id { get; set; } 

    public virtual String Save() 
    { 
     String s = ""; 
     //attach id to s 
     return s; 
    } 
} 

調用userInstance.Save()現在將返回你所有變量的字符串包括基類的id。 (如果你有一個複雜的樹,每個類只是應該爲它自己的屬性負責,這變得很方便。)

在實踐中,你不會建立一個字符串,但可能是一個XML元素或準備好的語句準備運行與數據庫。

+0

對不起如果我錯過了某些內容,但用戶作爲輸入的位置?以及我如何創建邏輯,我不知道我正在工作的類型。你可以填寫內部保存,讓我更好地理解。 – Mert

+0

@Mert你不需要用戶作爲輸入。它會像任何其他方法一樣繼承該方法。你總是可以找出你正在使用的具體類('if(this is User)')具體的Save-Implementation取決於你如何保存。 – dognose

+0

它的工作,但我失去了所有的通用功能,我將調查如果這有任何傷害我的一般解決方案。謝謝 – Mert