C# 使用通用类型处理对象创建

问题描述 投票:0回答:1

我想知道是否有更通用的方法来处理新对象的创建而无需知道确切的对象类型。

如果我有两个简单的对象类型作为

class TemplateA {
    public string field01;
    public string field02;
    public TemplateA(List<string> values) {
        this.field01 = values[0];
        this.field02 = values[1];
    }
}

class TemplateB {
    public string field01;
    public string field02;
    public string field03;
    public TemplateB(List<string> values) {
        this.field01 = values[0];
        this.field02 = values[1];
        this.field03 = values[2];
    }
}

然后我可以使用一个具有泛型类型的函数,它只接受一个列表列表并更改它调用的构造函数

using System;
using System.Collections.Generic;

public class Program {

    public static void Main() {

        List<List<string>> rows;
        rows = new List<List<string>>{
            new List<string> {"Row01_Field01", "Row01_Field02", "Row01_Field03", "Row01_Field04"},
            new List<string> {"Row02_Field01", "Row02_Field02", "Row02_Field03", "Row02_Field04"},
            new List<string> {"Row03_Field01", "Row03_Field02", "Row03_Field03", "Row03_Field04"}
        };
    
        List<TemplateA> itemsA = PopulateItems<TemplateA>(rows);
        List<TemplateB> itemsB = PopulateItems<TemplateB>(rows);
    
    }

    public static List<T> PopulateItems<T>(List<List<string>> rows) {
    
        List<T> items = new List<T>();
    
        foreach(List<string> row in rows) {
            T item = default(T);
            if(typeof(T) == typeof(TemplateA)) { item = (T)(object)new TemplateA(row); }
            if(typeof(T) == typeof(TemplateB)) { item = (T)(object)new TemplateB(row); }
            items.Add(item);
        }
    
        return items;
    
    }

}

虽然这看起来有点笨拙,因为每次添加新模板时,都需要将新的类型检查添加到 PopulateItems 函数中。

我想知道是否有一种方法可以以通用方式处理新对象的创建,从而绕过手动类型检查的需要

c# generics instantiation
1个回答
0
投票

您可以尝试使用

Activator.CreateInstance
类:

public static List<T> PopulateItems<T>(List<List<string>> rows)
{
    List<T> items = new List<T>();

    foreach (List<string> row in rows)
    {
        T item = (T)Activator.CreateInstance(typeof(T), row);
        items.Add(item);
    }

    return items;
}

这种方法消除了手动类型检查的需要,并允许您在不修改 PopulateItems 方法的情况下创建新的模板类。只知道使用反射可能比使用常规方法调用慢,所以如果性能是一个超级*问题,那么这可能不是正确的方法。

© www.soinside.com 2019 - 2024. All rights reserved.