2012-03-02 155 views
0

是否有將視圖模型傳遞給函數的方法?將查看模型傳遞給函數

我們有以下代碼

Activity a = new Activity(); 
a.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID; 
a.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0; 
a.isMember = !(WebSessions.IsCUser); 
a.isUser = (WebSessions.IsCUser); 

而且

OpenTask o = new OpenTask(); 
o.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID; 
o.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0; 
o.isMember = !(WebSessions.IsCUser); 
o.isUser = (WebSessions.IsCUser); 

我想創建,設置這些值,我

GetValuesForUserORMember(*pass in view model*) 
{ 
    thisView = *pass in view model* 

    thisView.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID; 
    thisView.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0; 
    thisView.isMember = !(WebSessions.IsCUser); 
    thisView.isUser = (WebSessions.IsCUser); 
} 

使用它做插入函數或更新

Activity a = new Activity(); 
a.ID = cID; 
a.ActivityModDate = date; 
GetValuesForUserORMember(a) <---function 
ctx.AddToActivities(a); 
ctx.SaveChanges(); 


OpenTask o = new OpenTask(); 
o.ID = cID; 
o.TaskCompletedDate = date; 
o.TaskAssingedTo = uID; 
GetValuesForUserORMember(o) <---function 
ctx.AddToActivities(o); 
ctx.SaveChanges(); 

這些(4)字段對於每個表/視圖模型(Activity和OpenTask)完全相同。但是,其他字段在每個表中都不相同。

回答

1

假設他們不分享基類或接口,你可以使用動態來做到這一點:

GetValuesForUserORMember(dynamic thisView) 
{ 
    thisView.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID; 
    thisView.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0; 
    thisView.isMember = !(WebSessions.IsCUser); 
    thisView.isUser = (WebSessions.IsCUser); 
} 
+0

假設他在.NET 4中工作。但使用動態CS。 – Ronald 2012-03-02 19:00:37

+1

嗯,是的 - 你必須使用支持該解決方案(或任何其他)的版本才能正常工作。但是,現在看到C#4現在已經有1.5年的歷史,並且沒有提到特定的版本 - 我將假設「當前」。也就是說,如果有人不清楚動態是在C#4中引入的 - 所以如果你的編譯器告訴你它不知道動態是什麼,那麼你就不能使用這個解決方案。 – 2012-03-02 20:07:25

+0

它工作完美! - 謝謝 – 2012-03-02 22:42:15

0

不知道我是否理解這個問題。但是,如果Activity和OpenTask具有需要在方法中填充的相同屬性,則應該創建一個包含屬性的基類並繼承該類。 然後,您可以在方法中使用BaseClass類型作爲參數。

0

看起來像只有一件事你需要的是一個ViewModel類的公共接口,它封裝了你要在方法中設置的所有字段。

// Define better name yourself 
// I believe IViewModel is pretty generic for your case 
public interface IViewModel 
{ 
    int memId { get; set; } 
    int caseUserID { get; set; } 
    bool isMember { get; set; } 
    bool isUser { get; set; } 
} 

class Activity : IViewModel 
{ ... } 

class OpenTask : IViewModel 
{ ... } 

最後的方法:

void SetValuesForUserORMember(IViewModel viewModel) 
{ 
    viewModel.memID = WebSessions.IsCUser ? 0 : WebSessions.MemID; 
    viewModel.caseUserID = WebSessions.IsCUser ? WebSessions.CUserID : 0; 
    viewModel.isMember = !WebSessions.IsCUser; 
    viewModel.isUser = WebSessions.IsCUser; 
} 

作爲替代解決方案,您可以在WebSessions在一個共同的接口定義這個方法並傳遞:

interface IViewModelBuilder 
{ 
    void UpdateUserAndMembeDetails(WebSession sessions); 
} 

void UpdateUserAndMembeDetails(WebSessions ws) 
{ 
    this.memID = ws.IsCUser ? 0 : ws.MemID; 
    this.caseUserID = ws.IsCUser ? ws.CUserID : 0; 
    this.isMember = !ws.IsCUser; 
    this.isUser = ws.IsCUser; 
} 
0

是的,你可以通過將視圖模型轉換爲函數作爲參數。您應該在每個視圖模型中實現相同的功能以支持Update()。同樣如你所想,你將需要覆蓋你的函數爲每種視圖模型,以支持不同類型的視圖模型參數被傳入。我會建議想不同的做法

1

我猜你的問題是因爲類型不同?如果是這樣,那麼你可以創建一個接口,這兩個對象都繼承,或者你可以創建一個基類(或兩者)。然後,您可以按照您所描述的創建方法,其中預期的參數是您的接口或基類的參數。然後您將能夠傳入任何繼承此類型的對象。

實際上,你可以用這種方式創建基類。

或者,您可以使用dynamic來做到這一點,但是您將失去任何靜態類型檢查的好處。如果你能控制你的類,我不會建議這樣做,因爲.NET是一種靜態語言。這只是爲了方便邊緣,他們添加了這種類型。不過,話又說回來,這只是我的動態

例意見:

//This is the base class option, but you could use an interface 
//If you encapsulate the FillProperties method it should be in a base class, though 
public class BaseViewModel 
{ 
    int memID {get;set;} 
    int caseUserID {get;set;} 
    bool isMember {get;set;} 
    bool isUser {get;set;} 

    public void FillProperties() 
    //These actions could also possibly be done on the fly in the properties 
    { 
     memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID; 
     caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0; 
     isMember = !(WebSessions.IsCUser); 
     isUser = (WebSessions.IsCUser); 
    } 
} 

public class Activity : BaseViewModel 
{ 
    //additional properties for Activity only 
} 

public class OpenTask : BaseViewModel 
{ 
    //additional properties for OpenTask only 
} 

然後,你可以叫它像這樣

var activity = new Activity(); 
activity.FillProperties(); 

或者,你可以刪除FillProperties到另一個類,你描述和做這樣的事情:

GetValuesForUserORMember(BaseViewModel thisView) 
{ 
    thisView.memID = (WebSessions.IsCUser) ? 0 : WebSessions.MemID; 
    thisView.caseUserID = (WebSessions.IsCUser) ? WebSessions.CUserID : 0; 
    thisView.isMember = !(WebSessions.IsCUser); 
    thisView.isUser = (WebSessions.IsCUser); 
}