假设我有以下两个类,理想情况下可以做我想要的:
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 的类型。
我是否遗漏了某些东西,或者在这种情况下是不是可以做我想做的事情?
答案 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);
}
}
}
然而,如上所述,在编译时,无法知道实际的泛型类型参数究竟是什么,因为该类型甚至不存在。