我有一种方法可以将粘贴复制到许多类中。该方法将模型混合到 IdNameViewModel 中。如何使用此方法创建一个类,我可以在存储库模型中传递该类并获取该模型的 IdName 列表?
注意:例如,ProjectValue 是我传入的模型/类,但它实际上可以是包含 id 和 name 属性的任何模型/类。
private IdNameVM HydrateEntityToVM(ProjectValue projectValue)
{
if (projectValue == null) return null;
return new IdNameVM()
{
Id = projectValue.Id,
Name = projectValue.Name
};
}
这是我根据以下答案得出的结论:
public class GenericHydrateIdName<TModel> where TModel : INameId
{
public IdNameVM HydrateEntityToVM(TModel model)
{
if (model == null) return null;
return new IdNameVM()
{
Id = model.Id,
Name = model.Name
};
}
}
}
如果有人在关注,请注意,上面的课程造成了太多的工作并违反了清洁代码原则。我使用了下面的扩展方法。
基本上,我能看到的最好的类型安全方式是拥有一个接口。
interface INameId
{
int Id { get; set; }
string Name { get; set; }
}
你可以在每个你想在其中使用它的类中都有这个接口。根据你目前的使用情况,我会建议一个扩展功能
static class VMExtensions
{
public static IdNameVM HydrateEntityToVM<TModel>(this TModel model)
where TModel : INameId
{
if (model == null) return null;
return new IdNameVM()
{
Id = model.Id,
Name = model.Name
};
}
// update: without generics as Marcus Höglund pointed out
public static IdNameVM HydrateEntityToVM2(this INameId model)
{
if (model == null) return null;
return new IdNameVM()
{
Id = model.Id,
Name = model.Name
};
}
static void Test()
{
var model = new ProjectValue();
var model2 = new AnotherModel();
var viewModel = model2.HydrateEntityToVM();
var viewModel2 = model2.HydrateEntityToVM();
}
}
如果您不想将接口添加到所有模型中,您可以使用反射(但请注意,它会非常慢)。
更新
正如 Marcus 指出的那样,在这种情况下,在函数中使用泛型没有实际意义。您可以使用HydrateEntityToVM2
直接使用接口的实现。但是,在将来,如果您想使用类似的东西,IdNameVM<TModel>
以便您仍然可以在需要时访问原始模型,那么HydrateEntityToVM
具有泛型的函数将很有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句