如何创建 C# 泛型方法

吉姆·凯利

我有一种方法可以将粘贴复制到许多类中。该方法将模型混合到 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中创建泛型方法重载?

来自分类Dev

如何创建泛型方法

来自分类Dev

C#创建包含泛型集合的泛型方法并调用Sum()

来自分类Dev

在C#中创建泛型类的字典的辅助方法

来自分类Dev

如何在C#中调用泛型重载方法

来自分类Dev

C#泛型:如何正确包装方法

来自分类Dev

如何创建泛型方法以返回泛型类型

来自分类Dev

如何在C#中从泛型创建对象

来自分类Dev

如何在C#中从泛型创建对象

来自分类Dev

C ++中的泛型方法

来自分类Dev

C ++中的泛型方法

来自分类Dev

如何创建泛型?

来自分类Dev

如何调用泛型方法?

来自分类Dev

如何应用泛型方法

来自分类Dev

C#-从一元类型方法(或类)创建并返回多类型泛型

来自分类Dev

C#-从一元类型方法(或类)创建并返回多类型泛型

来自分类Dev

如何从泛型方法调用非泛型方法

来自分类Dev

C ++:泛型类中的非泛型方法?

来自分类Dev

如何创建泛型的泛型列表?

来自分类Dev

如何将泛型传递给泛型方法?

来自分类Dev

如何从泛型方法<T>() 返回泛型 List<T>

来自分类Dev

如何在C#中对动态类型调用泛型方法

来自分类Dev

C#反射-如何获取接口以传递给泛型方法?

来自分类Dev

如何在C#中使用派生类型重写泛型方法

来自分类Dev

如何在具有多个约束的C#中实现泛型方法

来自分类Dev

如何允许C#8中的可为空的泛型类型作为方法的返回类型?

来自分类Dev

如何强制.NET(C#)使用方法的非泛型重载?

来自分类Dev

在C#中使用泛型时,如何运行子类的覆盖方法?

来自分类Dev

C#如何在方法中获取泛型类引用