我试图将通用方法参数转换为其类型。编译器说我无法转换它
public ProvideRequest ProvideRequest<T>(int numberOfLines,
string ServiceType,
T addressIdentifier)
{
var provideRequest = new ProvideRequest();
provideRequest.NumberOfLines = numberOfLines;
provideRequest.ServiceType = ServiceType;
Type t = typeof(T);
switch (t.GetType().Name)
{
case nameof(GoldAddressKeyIdentifierType):
provideRequest.RequestIdentifier =
Convert.ChangeType(addressIdentifier, typeof(GoldAddressKeyIdentifierType))
break;
}
return provideRequest;
}
对此有任何帮助将不胜感激。
答案 0 :(得分:2)
问题在于,在调用t.GetType()
时,您不会获得泛型类型,而只是System.Type
,它是t
的运行时类型。您想要的是通用类型的名称,您可以通过以下方式获取:
switch(typeof(T).Name)
此外Name
会返回一个字符串,因此您必须按如下方式编写cases
:
case MyNamepscae.GoldAddressKeyIdentifierType:
但是我强烈建议不要使用类型名称,只需切换实际类型本身。但是switch
语句只允许使用字符串,因此请改用if
:
if(typeof(T) == typeof(GoldAddressKeyIdentifierType))
答案 1 :(得分:1)
我建议比较两个Types
:
...
if (typeof(T) == typeof(GoldAddressKeyIdentifierType))
provideRequest.RequestIdentifier =
Convert.ChangeType(addressIdentifier, typeof(GoldAddressKeyIdentifierType));
return provideRequest;
但是, generics (<T>
)应该作为通用类型工作,任何特殊条件都是 bad parctice 。
答案 2 :(得分:1)
Type t = typeof(T); // type of T
switch (t.GetType().Name)
这个开关可能是个错误。 t是Type类型。所以t.GetType()是System.RuntimeType,所以t.GetType()。Name总是&#34; System.RuntimeType&#34;你知道吗。
据我了解你的问题,你需要删除.GetType(),你需要
switch(t.Name)
答案 3 :(得分:1)
由于您知道它的类型为GoldAddressKeyIdentifierType,因此您应该能够将对象转换为案例方法中的类
provideRequest.RequestIdentifier = (GoldAddressKeyIdentifierType)addressIdentifier;