Передать модель представления в функцию - PullRequest
0 голосов
/ 02 марта 2012

Есть ли способ передать модель (ы) вида в функцию?

У нас есть следующий код

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). Однако есть ДРУГИЕ поля, которые не совпадают в каждой таблице.

Ответы [ 5 ]

1 голос
/ 02 марта 2012

Полагаю, ваша проблема в том, что типы разные?Если это так, то вы можете либо создать интерфейс, от которого наследуются оба объекта, либо создать базовый класс (или оба).Затем вы можете создать метод, как вы описали, где ожидаемым параметром является интерфейс вашего интерфейса или базового класса.После этого вы сможете передать любой объект, который наследуется от этого типа.

Фактически вы могли бы создать базовый класс таким образом, чтобы он.

ИЛИ, вы могли бы использовать 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();

Или вы можете удалитьЗаполните свойства другого класса, как вы описали, и сделайте что-то вроде этого:

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);
}
1 голос
/ 02 марта 2012

Предполагая, что они не разделяют базовый класс или интерфейс, вы можете использовать динамический для этого:

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 голосов
/ 02 марта 2012

Похоже, единственное, что вам нужно - это общий интерфейс для классов 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 голосов
/ 02 марта 2012

Да, вы можете передать модель представления в функцию в качестве параметра.Вы должны реализовать одну и ту же функцию в каждой модели представления для поддержки Update ().Также, как вы можете себе представить, вам нужно будет переопределить свою функцию для каждого вида модели представления, чтобы поддерживать различные типы передаваемых параметров модели представления. Я бы посоветовал подумать о том, чтобы сделать это по-другому

0 голосов
/ 02 марта 2012

Не уверен, правильно ли я понял вопрос. Но если Activity и OpenTask имеют те же свойства, которые необходимо заполнить в вашем методе, вы должны создать базовый класс, содержащий свойства, и наследовать оба от этого класса. Затем вы можете использовать тип BaseClass в качестве параметра в вашем методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...