2009-09-01 54 views
1

我正在接受StreamWriter的方法,它可以是字符串,也可以是空值,也可以是长度,然后将值写入到StreamWriter中,填充为长度。如果值为空,我想写空格。我想做一些类似以下简单示例的示例,这仅用于演示目的。我可以创建一个接受空值<something>的通用函数吗?

public void FixedWrite(StreamWriter writer, string value, 
     int length) { 
    if (value == null) value = ""; 
    value = value.PadRight(length); 
    writer.Write(value); 
} 

public void FixedWrite<T>(StreamWriter writer, T value, 
     int length) where T : Nullable /* won't work of course */ { 
    string strVal; 
    if (!value.HasValue) strVal = null; 
    else strVal = value.Value.ToString(); 
    FixedWrite(writer, strVal, length); 
} 

我可以有各种不同的基础类型重载(他们所有日期,整型,布尔变量和小数),但我想看看我是否能得到通用版工作。有没有办法让T始终是一个可为空的类型,并且可以访问Nullable的属性(HasValue和Value)?或者我应该坚持使用底层类型特定的重载?

This question构成了一个类似的问题,但在我的情况下,这些值已经是可空的,我只想写出它的值,如果它有一个空格,如果它没有。

回答

12

尝试这样:

public void FixedWrite<T>(StreamWriter writer, Nullable<T> value, int length) 
    where T : struct 
{ 
    string strVal; 
    if (!value.HasValue) strVal = null; 
    else strVal = value.HasValue.ToString(); 
    FixedWrite(writer, strVal, length); 
} 
+0

当然。我让它比需要的更难。谢谢。 – 2009-09-01 18:20:13

+0

这可以工作,但是你*仍然可以将一个可为空的参数传递给泛型方法。 – 2009-09-01 18:29:41

0

简单的答案是否定的。

即使它是一个结构,由于可能出现递归问题,它在CLR中被明确禁止。

Nullable<Nullable<Nullable<etc.>>>() 
+0

可以做他想做的事情,即将可空类型作为通用参数传递。也可以测试该类型为null,因为Nullable不再是值类型,只需测试== null – 2009-09-01 18:27:16

+0

+1即可获取有用的信息。正如Oplapanax指出的那样,可以将一个可为空的参数作为一个泛型参数传递,但是Jaimal的正确性是,您无法定义一种通用方法来专门限制为可空的,这正是我之前的做法。不知道为什么这是downvoted,因为这是一个有益的和技术上正确的答案,我的问题。 – 2009-09-01 20:12:07

+0

'Nullable >'概念上没有错。像'Dictionary >'可能想要提供'TryGetvalue'方法,其返回值包含结果以及成功指示。如果不是针对'Nullable '的限制和古怪的行为,这种方法的逻辑类型将是'Nullable >'。如果返回的Hasvalue为true,那么Value就会使用指定的键保存存储在集合中的项目(如果Value.HasValue为false,那就意味着集合中存储了这个项目)。 – supercat 2012-12-23 17:43:26

3
public void FixedWrite<T>(StreamWriter writer, Nullable<T> value, int length) 

什么不对?

+3

为了进行编译,您必须将'T'限制为值类型,请参阅我的答案。 – 2009-09-01 18:20:08

+0

谢谢。我懒得发火,找出编译器实际上说的是什么:)。 – 2009-09-01 18:48:14

1

无需测试的HasValue,因为可空是一个结构,可以并处“新()”的约束:“?”

public void FixedWrite<T>(StreamWriter writer, T value, int length) where T : new() 
{ 
    // just test for NULL 
    string strVal = (value==null) ? string.Empty: value.ToString(); 
    FixedWrite(writer, strVal, length); 
} 

现在你骂它像这样(用符号是键):

FixedValue<System.DateTime?>(....) 
+0

但是我将无法访问HasValue和Value方法的值,因为编译器不会知道它是可以为空的,对吗? – 2009-09-01 18:45:43

+0

正确;测试NULL意味着它没有价值。如果它不为空,它就有一个值。 – 2009-09-01 18:54:57

+0

抱歉,编辑删除该语句的代码,希望更清楚。 – 2009-09-01 18:56:47

相关问题