扩展System.Convert

时间:2012-04-17 18:07:20

标签: c# .net .net-4.0 types type-conversion

System.Convert有一个非常有用的实用程序,用于将数据类型从一种类型转换为另一种类型。在我的项目中,我有很多自定义类型。我想将命令行参数转换为这些自定义类型(其中一些非常复杂)。如果这些在System.Convert中存在会很好,所以我可以这样做:

Convert.ToMyCustomType(args[1])

我想在我输入的时候在Visual C#IDE中显示它。我知道我可以简单地创建一个转换类型的例程,但我希望类型转换的处理方式与已经构建到框架中的方式相同。过去有没有人成功做到这一点?

5 个答案:

答案 0 :(得分:15)

不,您无法将它们添加到Convert课程 - 我建议您将转化方法添加到实际类型中,例如:

MyCustomType.FromInt32(...)

和实例方法走另一条路:

int x = myCustomType.ToInt32();

(静态工厂方法通常比添加大量重载构造函数IMO更好。它们允许各种替代方法 - 包括在适当的地方返回空值或缓存 - 并且可以使调用代码更清晰。)

我还强烈建议您过分关注您提供的转化次数。没有多少自定义类型真正具有来自各种原始类型的单一自然转换。

答案 1 :(得分:3)

不幸的是System.Convert是一个静态类,你不能扩展静态类。您只能从object派生静态类。


可能的方法是提供转换运算符(隐式或显式)

public class MyClass
{
    public static explicit operator MyClass(SomeOtherType other)
    {
        return new MyClass { /* TODO: provide a conversion here*/ };
    }

    public static explicit operator SomeOtherType(MyClass x)
    {
        return new SomeOtherType {  /* TODO: provide a conversion here*/ };
    }
}

通过此声明,您可以执行此操作

MyClass myClass = new MyClass();
SomeOtherType other = (SomeOtherType)myClass;

或者

SomeOtherType other = new SomeOtherType();
MyClass myClass = (MyClass)other;

答案 2 :(得分:2)

首先,System.Convert不是命名空间;它是一个静态类(有关更多信息,请参阅documentation)。你可以编写自己的Convert类!

static class Convert
{
    static MyCustomType ToMyCustomType(string value)
    {
         //logic here...
    }
}

如果要在使用System.Convert的同一文件中使用此类,可能需要为其添加另一个名称,以减少歧义。

答案 3 :(得分:0)

Convert是一个静态类,你不能扩展它。

但是,您可以根据需要使用Convert.ChangeType()

答案 4 :(得分:0)

如果您知道一个或多个类型,您将可以使用扩展方法(但不是System.Convert的扩展方法,如其他地方所述)。

例如,从字节数组转换为十六进制字符串(例如,当您希望从哈希中获得格式正确的十六进制字符串时),您可以执行以下操作:

''' <summary>Converts a byte array to a hexadecimal string.</summary>
''' <param name="Item">Required. The array of byte to convert.</param>
''' <returns>A hexadecimal string if converted successfully, error otherwise.</returns>
<Extension()>
Public Function [ToHexString](
    ByVal Item As Byte()) As String

    Dim Result As String = ""
    If Item IsNot Nothing Then
        For Each b As Byte In Item
            Result += b.ToString("X2")
        Next b
    End If
    Return Result
End Function

用法:

Dim myHexString As String = myByteArray.ToHexString()

结果:

FEE53B1AB64BD74AF8A95A9D4078141F196BA7A3

如果想花哨的话,可以添加一个可选参数来选择结果的大写或小写。

您可以根据要转换的类型重载方法,因此可以有一个用于从Long进行转换的方法(尽管已经可以使用标准的String函数进行转换)。