14

System.Convertには、データ型をある型から別の型に変換するための非常に便利なユーティリティがあります。私のプロジェクトでは、多くのカスタムタイプがあります。コマンドライン引数をこれらのカスタムタイプに変換したいと思います(そのうちのいくつかは非常に複雑です)。これらがSystem.Convert内に存在するので、次のようなことができれば便利です。

Convert.ToMyCustomType(args[1])

入力時にこれをVisualC#IDEに表示したいと思います。型を変換するルーチンを簡単に作成できることは知っていますが、型変換は、フレームワークにすでに組み込まれているものと同じ方法で処理されるようにしたいと思います。過去にこれを成功させた人はいますか?

4

5 に答える 5

16

いいえ、それらをクラスに追加することはできませんConvert-実際の型に次のような変換メソッドを追加することをお勧めします。

MyCustomType.FromInt32(...)

とインスタンスメソッドは逆になります:

int x = myCustomType.ToInt32();

(静的ファクトリメソッドは、多くのオーバーロードされたコンストラクタ、IMOを追加するよりも優れていることがよくあります。これらは、必要に応じてnull値を返す、またはキャッシュするなど、さまざまな代替手段を可能にし、呼び出し元のコードをより明確にすることができます。)

また、提供するコンバージョン数を超えないようにすることを強くお勧めします。すべての種類のプリミティブ型からの単一の自然変換を実際に持っているカスタム型は多くありません。

于 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、他の場所で説明されているように、ではありません)。

たとえば、バイトの配列から16進文字列に変換する場合(ハッシュから適切にフォーマットされた16進文字列が必要な場合など)、次のように実行できます。

''' <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 に答える