簡體   English   中英

將 model class 作為泛型類型參數傳遞

[英]Passing model class as a generic type parameter

我有這樣的骨架代碼。 我想創建一個可以將通用 model 作為其參數的方法。 在 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
    }
}

任何幫助將不勝感激。 謝謝你。

我會為此使用一個通用接口,例如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 等)。

從具有字段名稱的共同父級繼承 ModelA 和 ModelB,並制作類似

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

您可以為您的模型創建一個父 class 並將其類型作為參數傳遞。

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 class 的任何實例,您可能希望將其設為摘要。

一些鏈接

讀書:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM