有没有办法将视图模型传递给函数?
我们有以下代码
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)完全相同。但是,每个表中都有其他字段不相同。
答案 0 :(得分:1)
假设他们不共享基类或接口,您可以使用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);
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
不确定我是否理解这个问题。但是,如果Activity和OpenTask具有需要在方法中填充的相同属性,则应创建包含属性的基类,并从该类继承。 然后,您可以在方法中使用BaseClass类型作为参数。
答案 3 :(得分: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;
}
答案 4 :(得分:0)
是的,您可以将视图模型作为参数传递给函数。您应该在每个视图模型中实现相同的功能以支持Update()。另外,您可以想象,您需要覆盖每种视图模型的函数,以支持传递的不同类型的视图模型参数。我建议考虑采用不同的方式