2012-03-02 111 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); 
}