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(而是使用重载方法)。 我希望这不会在某个地方的生产代码中结束,仅仅是为了启发。