当前位置:  开发笔记 > 编程语言 > 正文

输入通用值(C#)

如何解决《输入通用值(C#)》经验,为你挑选了2个好方法。

当我尝试使用泛型类时,this.value为T:

if (this.value.GetType() == typeof(int))
{
    ((int)this.value)++;
}
else
{
    throw new InvalidOperationException
            ("T must be an int to perform this operation");
}

我得到一个编译时错误:"无法将类型'T'转换为'int'"

当它是int时,我该怎么做才能对this.value执行整数运算?

请注意,这只是一个例子.代码用泛型键入转换,"int"只是T的一种类型的示例.



1> Marc Gravell..:

不幸的是,很难让编译器相信特定的T实现.一种(讨厌的)方法是在中间转换为对象(注意这将是box和unbox值类型):

int i = (int)(object)this.value;
i++;
this.value = (T)(object)i;

丑陋但有效.在.NET 3.5中,我在这里有一些更好的泛型算术包装器.Operator类是MiscUtil的一部分; 在最简单的层面上,我怀疑AddAlternative可以很好地工作:

this.value = Operator.AddAlternative(this.value, 1);

这应该自动推断隐式,或者您可以自己添加它们:

this.value = Operator.AddAlternative(this.value, 1);

好处:这比原始代码更好,因为它实际上并不关心原始T - 它适用于支持"T +(T,int)"的任何类型(甚至是您自己的).

我认为还有一个ChangeType隐藏在那里的某个地方......

[编辑] Collin K和其他人对建筑的含义做了有效的评论 - 但实际上有时候T确实很重要......但除非真的有必要,否则我同意避免这种类型的专业化.那说(根据我对Collin的帖子的评论),能够执行诸如基本算术(增量,Int32除法等)之类的事情(例如)Matrix [对于T中的十进制/浮点数/ int/double /等]通常非常有价值.



2> Collin K..:

在我看来,泛型类中的特定于类型的代码是代码气味.我会重构它得到这样的东西:

public class MyClass
{
 ...
}

public class IntClass : MyClass
{
  public void IncrementMe()
  {
    this.value++;
  }
}


也许 - 但在某些情况下,简单的增量或Int32除数在泛型数学代码中很常见(例如Matrix ,其中T是float/double/decimal/int/etc).但在许多情况下,是的:某些事情已经成熟.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有