为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
MM们 2022-06-12 16:30:43
目前正在尝试对我拥有的方法进行基因改造。对泛型了解不多,如果看起来很愚蠢,请见谅......我目前的方法: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 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

假设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()orSingleOrDefault()即可获取项目和地图,如下所示:


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

    };

}


查看完整回答
反对 回复 2022-06-12
?
HUWWW

TA贡献1874条经验 获得超12个赞

如果你定义一个接口:


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;

}


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信