泛型类在编译时命名属性

时间:2019-04-21 16:43:22

标签: c# generics reflection

我试图编写一个通用类,将一些类型传递给它,然后通过属性访问它。

我已经编写了这段代码:

class Factory<T1, T2> where T1 : Test, new()
                      where T2 : Test, new()
{
    public T1 FirstType { get; set; }
    public T2 SecondType { get; set; }

    public Factory() 
    {
        FirstType = new T1();
        SecondType = new T2();
    }
}

我正在像这样使用它(OtherTest实现了Test):

Factory<Test, OtherTest> factory = new Factory<Test, OtherTest>();
factory.FirstType.MyMethod();

然后我可以使用FirstType和SecondType属性,但是如果我更改顺序:

Factory<OtherTest, Test> factory2 = new Factory<OtherTest, Test>();

这将具有不同的行为,因为FirstType将是OtherTest。我想传递实例并能够编写如下代码:

Factory<Test, OtherTest> factory = new Factory<Test, OtherTest>();
factory.Test.MyMethod();    //I want to generate properties named after class
factory.OtherTest.MyMethod();

我可以在编译时这样做吗?

1 个答案:

答案 0 :(得分:0)

您不能通过通用类型参数更改属性名称。最接近的是字典

Dictionary<string, Test> Tests;

然后,您可以使用typeof(T1).Namenameof以安全的方式提供属性名称。

Tests.Add(typeof(T1).Name, new T1());

Test test = Tests[nameof(FirstType)];