14

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

Convert.ToMyCustomType(args[1])

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

4

5 回答 5

16

不,您不能将它们添加到Convert类中-我建议将转换方法添加到您的实际类型中,例如:

MyCustomType.FromInt32(...)

而实例方法则相反:

int x = myCustomType.ToInt32();

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

我还强烈建议您不要过度提供您提供的转换数量。没有多少自定义类型真正具有从各种原始类型进行的单一自然转换。

于 2012-04-17T18:10:58.443 回答
2

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

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

如果您想在使用 System.Convert 的同一文件中使用此类,您可能需要给它另一个名称,以减少歧义。

于 2012-04-17T18:12:54.170 回答
2

不幸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;
于 2012-04-17T18:13:30.000 回答
0

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

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

于 2012-04-17T18:17:50.017 回答
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函数)。

于 2018-06-28T23:17:38.983 回答