使用泛型类作为非泛型类C#的属性

时间:2017-07-25 09:45:16

标签: c# generics

假设我有以下两个类,理想情况下可以做我想要的:

Foo.cs:

public class FooHelper<T> where T : struct
{
    public string Controller { get; set; }    = string.Empty;
    public string Action { get; set; }        = string.Empty;
    public string Area { get; set; }          = string.Empty;
    public string NameParameter { get; set; } = string.Empty;
    public T IdParameter { get; set; }        = default(T);

    public FooHelper() { }
    public FooHelper(string controller, string action, string area, string name, T id)
    {
        Controller    = controller;
        Action        = action;
        Area          = area;
        NameParameter = name;
        IdParameter   = id;
    }
}

FooHelper.cs:

Using the generic type 'FooHelper<T>' requires 1 type arguments

根据作为非泛型类 Foo 的构造函数的参数传入的整数值,属性FooHelper返回基于类的泛型类 FooHelper 的新实例无论是Guid还是int。

然而,如果不使 Foo 也是通用的,我似乎无法做到这一点,我不想要。我得到的错误是在FooHelper的属性行上,说明:

#define CATCH_CONFIG_MAIN #include <catch.hpp>

这是有道理的,但那时我还不知道。我想确定 Foo 的构造函数中 FooHelper 的类型。

我是否遗漏了某些东西,或者在这种情况下是不是可以做我想做的事情?

1 个答案:

答案 0 :(得分:7)

问题是公共FooHelper FooHelper甚至不会编译,因为没有名为FooHelper的类型。但是FooHelper<int>FooHelper<Guid>却没有任何共同之处。因此,这个问题(再次)是由于您在运行时提供信息(类型转换)并期望编译器在编译时推断出正确的泛型类型,这是不可能的。

你可以做的是创建一个非通用的接口,从你的所有助手派生出来,你的方法返回:

public interface IFooHelper { ... }
public class FooHelper<T> : IFooHelper where T : struct { ... }

现在在Foo - 课程内:

public IFooHelper FooHelper
{
    get
    {
        switch (Type)
        {
            case 1:
                return new FooHelper<Guid>("Foo", "Bar", "foobar", "", Guid.NewGuid());
            case 2:
            default:
                return new FooHelper<int>("Bar", "Foo", "", "", 11);
        }
    }
}

然而,如上所述,在编译时,无法知道实际的泛型类型参数究竟是什么,因为该类型甚至不存在。