1

私は C# でランダム値ジェネレーターを作成しています。このジェネリック関数は、渡された Type に応じてType BoolInt64Int32、の値を返す必要があります。Doubleをメソッド パラメータとして渡すことはできSystem.Typeますが、戻り値の型はどのように定義すればよいでしょうか。

例えば

GetRandomValueByType(TypeCode.Boolean) <--- Boolean を返します GetRandomValueByType(TypeCode.Double) <--- Double を返します GetRandomValueByType(TypeCode.Int32) <--- Int32 を返します

などなど。

ありがとうございました!

- - - - - - - - - - - - - -編集 - - - - - - - - - - - ----------

これは私が使用したコードです:

if (ta.IsPrimitive || Type.GetTypeCode(ta) == TypeCode.String)
{
    Random rnd = new Random();
    var buffer = new byte[sizeof(Int64)];
    rnd.NextBytes(buffer);
    switch (Type.GetTypeCode(ta))
    {
        case TypeCode.Boolean:
            oArr[ctr] = (rnd.Next(100) % 2 == 0);
            break;
        case TypeCode.Byte:
            oArr[ctr] = buffer[0];
            break;
        case TypeCode.SByte:
            oArr[ctr] = (sbyte)buffer[0];
            break;
        case TypeCode.Char:
            oArr[ctr] = Convert.ToInt32(Math.Floor(26 * rnd.NextDouble() + 65));
            break;
        case TypeCode.Decimal:
            oArr[ctr] = NextDecimal(rnd);
            break;
        case TypeCode.Double:
            oArr[ctr] = rnd.NextDouble() * rnd.Next(Int32.MaxValue);
            break;
        case TypeCode.Single:
            var buf = new byte[sizeof(Single)];
            rnd.NextBytes(buf);
            oArr[ctr] = BitConverter.ToSingle(buffer, 0);
            break;
        case TypeCode.Int32:
            oArr[ctr] = rnd.Next(Int32.MinValue, Int32.MaxValue);
            break;
        case TypeCode.UInt32:
            oArr[ctr] = rnd.Next(Int32.MaxValue) + (rnd.Next(100) % 2) * rnd.Next(Int32.MaxValue);
            break;
        case TypeCode.Int64:
            oArr[ctr] = BitConverter.ToInt64(buffer, 0);
            break;
        case TypeCode.UInt64:
            oArr[ctr] = BitConverter.ToUInt64(buffer, 0);
            break;
        case TypeCode.Int16:
            oArr[ctr] = rnd.Next(Int16.MaxValue);
            break;
        case TypeCode.UInt16:
            oArr[ctr] = rnd.Next(Int16.MaxValue) + (rnd.Next(100) % 2) * rnd.Next(Int16.MaxValue);
            break;
        case TypeCode.String:
            oArr[ctr] = RandomString(rnd.Next(100));
            break;
        default:
            oArr[ctr] = 0;
            break;
    }
}
else
{
    oArr[ctr] = getInstance(dllFile, ta.Name);
}
4

3 に答える 3

4

ここではジェネリックが便利な場合があります-次のようなことができます:

T GetRandomValueByType<T>() where T : IConvertible
{
   // Compute random...
   return Convert.ChangeType(randomValue, typeof(T));
}

これは、次の方法で呼び出されます。

double value = GetRandomValueByType<double>();

ただし、実装されているが不適切なSystem.Type型を渡すことができるため、これは完全に安全ではありません (using もそうではありません)。IConvertible


あなたのコメントを踏まえて、別の方法を作成することをお勧めします。

bool GetRandomBoolean() { // ...
double GetRandomDouble() { // ...
int GetRandomInt() { // ...

すでに型をオンにして特定の実装を作成しようとしている場合、これはそれを処理するためのよりクリーンで安全な方法を提供します。別々のメソッドを持つことで、間違った型を渡す可能性を排除し、API を簡素化します。

于 2012-12-12T22:08:28.187 に答える
1

これらのメソッドをジェネリックにする必要があります。

T GetRandomValueByType<T>()
{
    ...
}

GetRandomValueByType<Boolean>();
GetRandomValueByType<Double>();
GetRandomValueByType<Int32>();
于 2012-12-12T22:08:27.500 に答える
0

あなたは一般的な実装です:

    public class Generic
    {
      public static T GetRandomValueByType<T>(T parameter)
      {
        switch(typeof(T))
        {
            case System.Int32:
                Random r = new Random();
                return (T)r.Next();
            case System.Guid:
                return (T)Guid.NewGuid();
            // other cases here...
}
      }
    }

次のようなものを使用します。

var value = Generic.GetRandomValueByType<bool>();

Randomクラスを使用して、サンプルとしてランダムな値を提供することもできます。

于 2012-12-12T22:10:34.607 に答える