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
};
}
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;
}
- 2 回答
- 0 关注
- 93 浏览
添加回答
举报