我有以下辅助方法:
public static T CreateRequest<T>()
where T : Request, new()
{
T request = new T();
// ...
// Assign default values, etc.
// ...
return request;
}
我想从另一个助手中的另一个方法内部使用此方法:
public T Map<F, T>(F value, T toValue)
where T : new()
where F : new()
{
if (typeof(T).BaseType.FullName == "MyNamespace.Request")
{
toValue = MyExtensions.CreateRequest<T>();
}
else
{
toValue = new T();
}
}
但后来我收到错误:
类型“T”不能用作泛型类型或方法“MyExtensions.CreateRequest()”中的类型参数“T”。没有从“T”到“MyNamespace.Request”的装箱转换或类型参数转换。
有没有办法强制转换类型“T”,以便 CreateRequest 可以毫无问题地使用它?
EDIT:
我知道我可以做两件事:
- 放宽对 CreateRequest 的限制或
- 收紧 Map 中的约束。
但我不能做第一个,因为在 CreateRequest 中我使用 Request 类的属性,而我不能做第二个,因为我使用其他类型(不从 Request 继承)和 Map 函数。
对于这种情况,您需要放宽以下通用限制CreateRequest
.
public static T CreateRequest<T>()
where T : new()
{
if(!typeof(Request).IsAssignableFrom(typeof(T)))
throw new ArgumentException();
var result = new T();
Request request = (Request)(object)result;
// ...
// Assign default values, etc.
// ...
return result ;
}
这可能会很痛苦,因为您会丢失此参数的编译时验证。
或者如果你想使用CreateRequest
其他地方的方法然后仅为此场景创建非通用重载。
public static object CreateRequest(Type requestType)
{
if(!typeof(Request).IsAssignableFrom(requestType))
throw new ArgumentException();
var result = Activator.CreateInstance(requestType);
Request request = (Request)result;
// ...
// Assign default values, etc.
// ...
return result ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)