我有以下帮助方法:
public static T CreateRequest<T>()
where T : Request, new()
{
T request = new T();
// ...
// Assign default values, etc.
// ...
return request;
}
Run Code Online (Sandbox Code Playgroud)
我想从另一个帮助器中的另一个方法内部使用此方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
但后来我得到了错误:
类型'T'不能用作泛型类型或方法'MyExtensions.CreateRequest()'中的类型参数'T'.从'T'到'MyNamespace.Request'没有装箱转换或类型参数转换.
有没有办法转换类型"T",以便CreateRequest将使用它没有问题?
编辑:
我知道我可以做两件事:
但我不能做第一个,因为在CreateRequest中我是Request类的用户属性,而我不能做第二个,因为我使用其他类型(不从Request继承)和Map函数.
您声明的类型T是Request在CreateRequest方法; 另一方面,在Map方法中你没有这样的约束。尝试将声明更改Map为:
public T Map<F, T>(F value, T toValue)
where T : Request, new()
where F : new()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您需要放宽对的通用限制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 ;
}
Run Code Online (Sandbox Code Playgroud)
这可能会很痛苦,因为您会丢失此参数的编译时验证。
或者,如果您想在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 ;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18488 次 |
| 最近记录: |