当T可以是多个new()类型时,如何生成方法?

时间:2018-12-13 16:57:50

标签: c# generics model

目前试图证明我的方法。对非专利药知之甚少,对不起,如果感到愚蠢...

我目前拥有的方法:

Aspect Fit

事实是,现在SimpleGenericModel也可以是RegionModel和SecteurDActiviteModel ...

我尝试过这个:

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;
        }

但是我有点迷茫了... 任何帮助将不胜感激...:)

2 个答案:

答案 0 :(得分:2)

假设RegionModelSecteurDActiviteModel将共享IdNom属性,我建议您创建一个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
    };
}

答案 1 :(得分:1)

如果您定义接口:

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;
}