Как генерировать метод, когда T может быть несколько новых () типов? - PullRequest
0 голосов
/ 13 декабря 2018

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

Текущий метод, который у меня есть:

public SimpleGenericModel GetSimpleModelFromMultiNode(FicheArticleViewModel model, string alias) 
        {
            var listeItems = CurrentPage.GetPropertyValue<IEnumerable<IPublishedContent>>(alias);
            var result = new SimpleGenericModel();

            if (!CurrentPage.HasValue(alias)) return result;

            foreach (var item in listeItems)
            {
                result.Id = item.Id.ToString();
                result.Nom = item.Name;
            }

            return result;
        }

Дело в том, что теперь SimpleGenericModel также может быть RegionModel иSecteurDActiviteModel ...

Я пробовал это:

 public T GetSimpleModelFromMultiNode<T> (FicheArticleViewModel model, string alias) where T: new()
        {
            var listeItems = CurrentPage.GetPropertyValue<IEnumerable<IPublishedContent>>(alias);

            var result = new T();

            //if (typeof(T) == typeof(SimpleGenericModel))
            //{
            //    result = new SimpleGenericModel();
            //}
            //else if (typeof(T) == typeof(RegionViewModel))
            //{
            //    result = new RegionViewModel();

            //}
            //else if (typeof(T) == typeof(SecteurDActiviteViewModel))
            //{
            //    result = new SecteurDActiviteViewModel();
            //}

            if (!CurrentPage.HasValue(alias)) return result;

            foreach (var item in listeItems)
            {
                result.Id = item.Id.ToString();
                result.Nom = item.Name;
            }

            return result;
        }

но я немного потерян в этом ... Любая помощь будет оценена ...:)

Ответы [ 2 ]

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

Предполагая, что RegionModel & SecteurDActiviteModel будет иметь общие свойства Id & Nom, я бы посоветовал вам создать ISomeInterface и реализовать его для ваших типов RegionModel : ISomeInterface.Нет необходимости возвращать фактический тип, как вы делаете - result = new SimpleGenericModel(); - тип будет известен во время компиляции по T, который вы передаете методу.

С новым интерфейсом вы можете ограничитьметод еще больше похож на этот:

public T GetSimpleModelFromMultiNode<T> (FicheArticleViewModel model, string alias) where T: new(), ISomeInterface,

Итак, ваша структура должна выглядеть так:

public T GetSimpleModelFromMultiNode<T>(string model, string alias) where T : ISomeInterface, new()
{
    var listeItems = CurrentPage.GetPropertyValue<IEnumerable<IPublishedContent>>(alias);
    var result = new T();
    if (!CurrentPage.HasValue(alias)) return result;
    foreach (var item in listeItems)
    {
        result.Id = item.Id.ToString();
        result.Nom = item.Name;
    }
    return result;
}

public interface ISomeInterface
{
    int Id { get; set; }
    string Nom { get; set; }
}

public class RegionModel : ISomeInterface
{
    //Your implementation goes here
}

public class SecteurDActiviteModel : ISomeInterface
{
    //Your implementation goes here
}

Еще одна вещь: вы снова и снова сопоставляете один и тот же объект с одними и теми же свойствами, что не имеет смысла, если вы хотите получить коллекцию T из listeItems.Вы должны изменить свой код следующим образом:

public IEnumerable<T> GetSimpleModelFromMultiNode<T>(string model, string alias) where T : ISomeInterface, new()
{
    var listeItems = CurrentPage.GetPropertyValue<IEnumerable<IPublishedContent>>(alias);   
    if (!CurrentPage.HasValue(alias)) return Enumerable.Empty<T>();
    return listeItems.Select(i => new T 
    {
        Id = i.Id.ToString(),
        Nom = i.Name,
    });
}

РЕДАКТИРОВАТЬ:

Если ваши listeItems будет иметь одно значение, просто сделайте FirstOrDefault() или SingleOrDefault()чтобы получить предмет и карту, как это:

public T GetSimpleModelFromMultiNode<T>(string model, string alias) where T : ISomeInterface, new()
{
    var listeItem = CurrentPage.GetPropertyValue<IEnumerable<IPublishedContent>>(alias).FirstOrDefault();   
    if (!CurrentPage.HasValue(alias)) return new T();

    if (listeItem == null)
    {
        return new T();
    }

    return new T
    {
        Id = listeItem.Id.ToString(),
        Nom = item.Name
    };
}
0 голосов
/ 13 декабря 2018

Если вы определяете интерфейс:

interface INomAndId
{
    int Id { get; set; }
    string Nom  { get; set; }
}

И внедряете его в свои модели:

class SimpleGenericModel : INomAndId
{
    public int Id { get; set; }
    public string Nom { get; set; }
}

class RegionViewModel : INomAndId
{
    public int Id { get; set; }
    public string Nom { get; set; }
}

class SecteurDActiviteViewModel : INomAndId
{
    public int Id { get; set; }
    public string Nom { get; set; }
}

class FicheArticleViewModel : INomAndId
{
    public int Id { get; set; }
    public string Nom { get; set; }
}

Вы можете использовать интерфейс в качестве ограничения:

where T: INomAndId, new()

Что позволит вам заполнить новый объект:

public T GetSimpleModelFromMultiNode<T> (FicheArticleViewModel model, string alias) where T: INomAndId, new()
{
    var listeItems = CurrentPage.GetPropertyValue<IEnumerable<IPublishedContent>>(alias);
    var result = new T();
    if (!CurrentPage.HasValue(alias)) return result;
    foreach (var item in listeItems)
    {
        result.Id = item.Id.ToString();
        result.Nom = item.Name;
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...