Подстановочный знак для параметра в C # - PullRequest
0 голосов
/ 07 декабря 2018

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

public class LocalityGeneratorForm
{
    [Key]
    public int id { get; set; }
    [Display(Name = "Description of the field")]
    public Locality[] locality { get; set; }
    public virtual ICollection<Locality> Localities { get; }
}

public class GoalGeneratorForm
{
    [Key]
    public int id { get; set; }
    [Display(Name = "A different description of the field")]
    public Goal[] goal { get; set; }
    public virtual ICollection<Goal> Goals { get; }
}

public class ProcessGeneratorForm
{
    [Key]
    public int id { get; set; }
    [Display(Name = "A third description of the field")]
    public Process[] process { get; set; }
    public virtual ICollection<Process> Processes { get; }
}

public class FieldGeneratorForm
{
    [Key]
    public int id { get; set; }
    [Display(Name = "The other new description of the field")]
    public Field[] field { get; set; }
    public virtual ICollection<Field> Fields { get;  }
}

Хорошо, поэтому все эти ViewModels действительно похожи, они отличаются только типом ICollection.Теперь, чтобы сгенерировать строку HTML, я буду использовать функцию, которая будет принимать два параметра: один - имя частичного представления, которое будет служить шаблоном, а другой - модель.

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

private string ConvertViewToString( string viewName, <GenericClass> model ) 
{
    //-- Do stuff..
    return "My HTML";
}

Первый вопрос: возможно ли это, и если да, то какЯ объявляю универсальный параметр?спасибо!

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я думаю, что вам нужен не общий метод / класс.Лучший способ добиться этого - изменить ConvertViewToString так, чтобы он принимал интерфейс, а не конкретную реализацию.Внедрение интерфейса в метод будет в будущем гораздо более гибким.

public interface IHtmlElement {
    string ToHtmlString();
}

public class LocalityGeneratorForm : IHtmlElement
{
    [Key]
    public int id { get; set; }
    [Display(Name = "Description of the field")]
    public Locality[] locality { get; set; }
    public virtual ICollection<Locality> Localities { get; }
    public string ToHtmlString()
    {
        // convert Locality to html string representation
        return "<p>HTML element string for Locality</p>"
    }
}

public class GoalGeneratorForm : IHtmlElement
{
    [Key]
    public int id { get; set; }
    [Display(Name = "A different description of the field")]
    public Goal[] goal { get; set; }
    public virtual ICollection<Goal> Goals { get; }
    public string ToHtmlString()
    {
        // convert Goal to html string representation
        return "<p>HTML element string for Goal</p>"
    }
}

На следующем шаге вы можете выполнить реализацию ConverViewToString следующим образом:

private string ConvertViewToString( string viewName, IHtmlElement element ) 
{
    //-- Do stuff..
    return element.ToHtmlString();
}

Этокак вы можете собрать все вместе:

var locality = new LocalityGeneratorForm();
var goal = new GoalGeneratorForm();

var htmlLocality = ConvertViewToString("some name", locality);
var htmlGoal = ConvertViewToString("some name", goal);

Надеюсь, мой ответ поможет вам сделать вашу реализацию более гибкой.

0 голосов
/ 07 декабря 2018

Если вы хотите использовать общий метод, вы можете просто сделать:

private string ConvertViewToString<T>(string viewName, T model) {
    //-- Do stuff..
    return "My HTML";
}

// How to call this method?
LocalityGeneratorForm localGenForm = new LocalityGeneratorForm(); /* Simple instancing */

// in this case, T will automatically LocalityGeneratorForm.
ConvertViewToString(some_string, localGenForm);

// or you can explicit define what T type is
ConvertViewToString<LocalityGeneratorForm>(some_string, localGenForm);

и если вы хотите ограничить тип параметра типа T, вы можете использовать where.

Если вы действительно хотите наложить ограничение на то, что метод ConvertViewToString будет принимать SomethingTopModelClass и только его производные типы, вы можете использовать это так:

private string ConvertViewToString<T>(string viewName, T model) where T: SomethingTopModelClass {
    //-- Do stuff..
    return "My HTML";
}

Мое объяснение может быть трудно понять (плохой английский: S), поэтому я рекомендую вам прочитать о документах ниже.

Общие C # (MSDN)

Общие C # - Где (MSDN)

...