将模型类作为泛型类型参数传递

时间:2021-04-21 19:09:47

标签: c#

我有一个这样的框架代码。我想创建一个可以将通用模型作为参数的方法。在 GenericMethod 内部,如果我想访问模型的属性,我实际上如何配置方法?

public class ModelA
{
    public string Name { get; set;}
    public int Property1 { get; set; }
}

public class ModelB
{
    public string Name { get; set;}
    public int Property2 { get; set; }
}

public class MainClass
{
    public async Task<int> ProcessA()
    {
        await GenericMethod(ModelA modelA);
    }

    public async Task<int> ProcessB()
    {
        await GenericMethod(ModelB modelB);
    }

    public async Task<int> GenericMethod<T>(T model) where T : something?
    {
        // Get model name here like this
         model.Name
    }
}

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:3)

我会为此使用一个通用接口,例如 IHaveName

public interface IHaveName
{
    string Name { get;set; }
}


public class ModelA: IHaveName
{
    public string Name { get; set; }
}

public class ModelB: IHaveName
{
    public string Name { get; set; }
}

现在您可以对其进行约束:

public async Task<int> GenericMethod<T>(T model) where T : IHaveName
{
    // Get model name here like this
     model.Name
}

这里的接口比类更好,因为您可以实现多个并且它们还有其他优势(例如单元测试、IoC 等)。

答案 1 :(得分:1)

从具有字段名称的公共父级继承 ModelA 和 ModelB,并使其像

public async Task<int> GenericMethod<T>(T model) where T : IModelParent

答案 2 :(得分:0)

您可以为模型创建一个父类并将其类型作为参数传递。

abstract class ModelParent
{
    public virtual string Name { get; set; }
}

public class ModelA : ModelParent
{
    public override string Name { get => base.Name; set => base.Name = value; }
}

public class ModelB : ModelParent
{
    public override string Name { get => base.Name; set => base.Name = value; }
}

public class MainClass
{
    public async Task<int> ProcessA()
    {
        await GenericMethod(ModelA modelA);
    }

    public async Task<int> ProcessB()
    {
        await GenericMethod(ModelB modelB);
    }

    public async Task<int> GenericMethod<T>(T model) where T : ModelParent
    {
        // Get model name here like this
        model.Name
    }
}

假设您不需要/不想要 Parent 类的任何实例,您可能希望将其设为抽象。

一些链接

阅读: