将视图模型传递到函数中
本文关键字:函数 视图 模型 | 更新日期: 2023-09-27 18:26:24
有没有办法将视图模型传递到函数中?
我们有以下代码
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();
对于每个表/视图模型(Activity和OpenTask),这(4)个字段完全相同。但是,每个表中都有不同的OTHER字段。
假设它们不共享基类或接口,则可以使用dynamic:
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);
}
我猜你的问题是因为类型不同?如果是这样,则可以创建两个对象都继承自的接口,也可以创建基类(或两者都创建)。然后,您可以按照描述创建方法,其中预期的参数是接口或基类的参数。然后,您将能够传入从该类型继承的任何对象。
事实上,你可以用这样一种方式创建基类。
或者,您可以使用动态来执行此操作,但是您将失去任何静态类型检查的好处。如果你可以控制你的类,我不建议这样做,因为.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);
}
不确定我是否理解这个问题。但是,如果Activity和OpenTask具有需要在方法中填充的相同属性,则应该创建一个包含这些属性的基类,并从该类继承这两个属性。然后可以在方法中使用BaseClass类型作为参数。
是的,您可以将视图模型作为参数传递到函数中。您应该在每个视图模型中实现相同的函数来支持Update()。正如你所能想象的,你需要为每种视图模型覆盖你的函数,以支持传入的不同类型的视图模型参数
看起来您只需要一个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;
}