将Generic T转换为C#类型

时间:2016-07-22 12:33:19

标签: c# generics casting

我试图将通用方法参数转换为其类型。编译器说我无法转换它

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;
}

对此有任何帮助将不胜感激。

4 个答案:

答案 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;