我知道typeof(T)但编译器没有。 怎么修?

我正在尝试编写这样的方法:

public static T Test() { if (typeof(T)==typeof(string)) return "1241"; // do something else } 

但我似乎无法弄清楚如何把它拉下来。 我想根据调用方法的T类型返回值。 我需要返回字符串,int,自定义类,List等。

实际的用例是一些自定义序列化代码,其中反序列化代码必须知道它应该生成的对象的类型。

澄清:上面的示例给出以下错误:无法将字符串转换为类型T.

理想的解决方案适用于值类型和引用类型,并且不包含用于重载解析的虚拟参数。

我开始怀疑是否存在理想的解决方案。

谢谢,卢卡斯

object的中间转换并不理想,但这样的事情应该可以解决问题:

 public static T Test() { if (typeof(T) == typeof(string)) return (T)(object)"1241"; // do something else } 

您必须将返回值强制转换为T,例如类似于引用类型:

 public static T Test() where T : class { if (typeof(T)==typeof(string)) return "1241" as T; return default(T); } 

小心 ! 下面的解决方案不起作用(使用Mono gmcs C#编译器validation)。

但是,它应该通过我阅读C#标准来工作,因为重载决策应该尽可能地支持方法的非generics版本。 ECMA-334的相关部分是25.1.7:“generics类中的重载”。 此外,Eric Lippert似乎也在博客文章中这样说 。

反馈将不胜感激:为什么这不能按预期工作?


你有不相关的类型和不相关的行为:这段代码尖叫“ 使用重载 !”

generics适用于不相关的类型,但相同(或高度相似)的行为。

这样做(完成测试程序以重现行为):

 using System; class TestClass { public static T Test() { return TestWith(default(T)); // do something else } public static string TestWith(string dummy) { // Used only for `string`. return "string"; } public static T TestWith(T dummy) { // Used for everything else. return dummy; } static void Main() { Console.WriteLine("Expected \"0\", got \"{0}\"", Test()); Console.WriteLine("Expected \"string\", got \"{0}\"", Test()); } } 

gmcs编译,产生:

 Expected "0", got "0" Expected "string", got "" 

这里,该参数仅用于消除重载呼叫的歧义。 这里不能使用显式通用参数,因为其中一个函数( string )不是通用的。

尝试

 public static T Test() where T : class { if (typeof(T) == typeof(string)) return "asdf" as T; // do something else // do something else } 

你可以使用ChangeType吗?

 public static T Test() { if (typeof(T)==typeof(string)) return (T)Convert.ChangeType("1234", typeof(T), CultureInfo.InvariantCulture); return default(T); } 

我找到了解决方案:

 public static T Test() { if (typeof(T) == typeof(string)) return (T)(object)"1241"; // this works. // do something else } 

感谢所有的答案。

 public static T Test() { if (typeof(T)==typeof(string)) return (T)Convert.ChangeType("1241", typeof(T)); return default(T); } 

我没有测试过它:-)