如何根据C#中的IF返回不同的对象(泛型)

时间:2018-08-23 08:40:22

标签: c# asp.net-mvc dynamic-programming

我有一个ASP.NET MVC(非核心)项目,遇到了一些问题,我认为终于可以解决如何正确使用泛型可以解决我的问题了。

我的情况是我有一个SQL连接,该连接返回数据,并且根据SQL中一个字段的结果,我想使用两种不同的模型。这些模型具有许多共同的属性,因此我认为最佳实践是创建一种方法,该方法选择要创建的模型,填充差异,返回模型,然后继续填充“公共”属性。

我尝试阅读一些有关泛型的知识,但是我对此很陌生,所以我没有取得太大进展。

我的代码示例如下:

public ResultVM MainClass()
{
    var resultData = new ResultVM();

    // ... SQL returns data

    while (reader.Read())
    {
        resultData.Add(reader);
    }

    return resultData;
}

public object CreateObject(SqlDataReader indata)
{

    if((indata["Associate"].ToString()) == "0")
    {
        var individual = new Individual();
    }
    else
    {
        var group = new Group();
    }

    return object;
}

如何动态地(取决于Associate字段的值)创建个人或组?

2 个答案:

答案 0 :(得分:0)

如何实现具有所有通用属性的接口?

类似

interface IInterface
{
    string CommonProperty1 { get; set; }
    string CommonProperty2 { get; set; }
}

class Individual : IInterface
{
    // ...
}

class Group : IInterface
{
    // ...
}

public IInterface CreateObject(SqlDataReader indata)
{
    if((indata["Associate"].ToString()) == "0")
    {
        var individual = new Individual();
        // ...  
        return individual;
    }
    else
    {
        var group = new Group();
        // ...
        return group;
    }
}

答案 1 :(得分:0)

我建议您直接与System.Type合作。根据您的实际需求,这里可以有多种更优雅的解决方案:

  1. indata.GetFieldType(int ordinal)将返回您字段的.NET类型
  2. Serialize data with type handling,那么您可以在非通用反序列化之后简单地获取类型。例如:

    var result = JsonConvert.DeserializeObject(dataJson);
    

result将具有您实际对象类型的Type。您可以检查它是否写入result.GetType()并创建此类型的对象。有关更高级的用法,请参见Activator.CreateInstance(...)

  1. 在大多数情况下,使用接口是最好的方法:

    interface ISomething
    {
        // ...
    }
    
    class Individual : ISomething
    {
        // ...
    }
    
    class Group : ISomething
    {
        // ...
    }
    

然后,您通过这种方式构建非泛型方法:

public ISomething CreateObject(SqlDataReader indata) 
{
    if((indata["Associate"].ToString()) == "0")
        return new Individual();
    else
        return new Group();
}

您创建的通用对象可能看起来像这样:

public T CreateObject<T>(SqlDataReader indata) 
{
    var o = new T();
    return o;
}

在键入T的地方,您将通过以下方法传递:CreateObject<YourType>(indata) T可以是您想要的任何类型,包括接口。在使用泛型时,您可能还希望通过使用is关键字来检查类型,但是我建议使用接口并完全避免使用is检查。 示例:

if(yourObject is YourType)
{
    (yourObject as YourType).SomeSpecificToYourTypeMethod();
    // ...
}