目前试图证明我的方法。对非专利药知之甚少,对不起,如果感到愚蠢...
我目前拥有的方法:
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;
}
但是我有点迷茫了... 任何帮助将不胜感激...:)
答案 0 :(得分:2)
假设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
};
}
答案 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;
}