C#:如何使用带有“out”变量的generics方法

我想创建一个简单的通用函数

void Assign(out T result) { Type type = typeof(T); if (type.Name == "String") { // result = "hello"; } else if (type.Name == "Int32") { // result = 100; } else result = default(T); } 

用法:

 int value; string text; Assign(value); // <<< should set value to 100 Assign(text); // <<< should set text to "hello" 

我的问题是如何编写代码来设置这些值,即。 评论部分中缺少的代码。

谢谢你的帮助。

看起来在这种情况下,你可能正在努力避免拳击? 没有更多信息很难说,但是对于这个具体的例子,使用方法重载会更容易并且可能更不容易出错:

 void Assign(out string value) { //... } void Assign(out int value) { //... } 

为了明确了解这里的错误,您需要在将对象强制转换为generics类型之前将其转换为对象:

 (T)(object)"hello world!"; 

哪个IMO非常讨厌,应该是最后的手段 – 当然不会让你的代码变得更干净。

无论何时对通用参数进行类型检查,都可以很好地指出generics不是解决问题的正确方法。 进行通用参数类型检查会使代码更复杂,而不是更简单。 它使一种方法负责基于类型的不同行为,而不是一系列易于更改而不会意外影响其他方法的单一方法。 请参阅单一责任原则 。

首先,这是一个非常糟糕的模式。 你不应该使用这种模式。 也许如果你描述你真正想要实现的目标,那么会有更好的答案。

下面的代码有效,但正如我所说的那样编写代码是一个坏主意。

  void Assign(out T result) { Type type = typeof(T); if (type.Name == "String") { result = (T) ((object)"hello"); } else if (type.Name == "Int32") { result = (T) ((object)100); } else result = default(T); } 

用法:

  int value; string text; Assign(out value); Assign(out text); 
 public T GetObject(string val) { T _object = default(T); _object = (T)Convert.ChangeType(val, typeof(T)); return _object; } 

这是一种方式:

 static void Assign(out T result) { Type type = typeof(T); if (type.Name == "String") { result = (T)Convert.ChangeType("hello", typeof(T)); } else if (type.Name == "Int32") { result = (T)Convert.ChangeType(100, typeof(T)); } else { result = default(T); } } 

但是这段代码非常糟糕,并且违背了generics(而是使用重载方法)。 我希望这不会在某个地方的生产代码中结束,仅仅是为了启发。