作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑以下(高度简化的)代码:
public T Function<T>() {
if (typeof(T) == typeof(string)) {
return (T) (object) "hello";
}
...
}
首先转换为 object
,然后转换为 T
有点荒谬。但是编译器无法知道先前的测试确定 T
是 string
类型。
在 C# 中实现此行为的最优雅、最惯用的方法是什么(包括摆脱愚蠢的 typeof(T) == typeof(string)
,因为 T 是字符串
不能使用)?
附录:.net 中没有返回类型差异,因此您不能将函数重载为类型字符串(顺便说一句,这只是一个示例,但原因之一多态性中的关联结束重新定义,例如 UML,不能在 c# 中完成)。显然,以下内容会很棒,但它不起作用:
public T Function<T>() {
...
}
public string Function<string>() {
return "hello";
}
具体示例 1: 由于针对特定类型进行测试的通用函数不是通用这一事实已受到多次攻击,因此我将尝试提供一个更完整的示例。考虑 Type-Square 设计模式。下面是一个片段:
public class Entity {
Dictionary<PropertyType, object> properties;
public T GetTypedProperty<T>(PropertyType p) {
var val = properties[p];
if (typeof(T) == typeof(string) {
(T) (object) p.ToString(this); // magic going here
}
return (T) TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(val);
}
}
具体示例 2:考虑解释器设计模式:
public class Expression {
public virtual object Execute() { }
}
public class StringExpression: Expression {
public override string Execute() { } // Error! Type variance not allowed...
}
现在让我们在 Execute 中使用泛型来允许调用者强制返回类型:
public class Expression {
public virtual T Execute<T>() {
if(typeof(T) == typeof(string)) { // what happens when I want a string result from a non-string expression?
return (T) (object) do_some_magic_and_return_a_string();
} else if(typeof(T) == typeof(bool)) { // what about bools? any number != 0 should be True. Non-empty lists should be True. Not null should be True
return (T) (object) do_some_magic_and_return_a_bool();
}
}
}
public class StringExpression: Expressiong {
public override T Execute<T>() where T: string {
return (T) string_result;
}
}
最佳答案
如果您使用通用方法进行这些类型的检查,我会重新考虑您的设计。该方法显然不是真正的通用 - 如果是,您就不需要特定类型检查...
像这样的情况通常可以通过重新设计来更干净地处理。一种替代方法通常是提供适当类型的重载。也存在避免特定类型行为的其他设计替代方案,例如 Richard Berg's suggestion of passing in a delegate .
关于c# - 泛型方法中的条件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2269233/
我是一名优秀的程序员,十分优秀!