3

nullables を指定された小数点以下の桁数に丸めるメソッドを作成しようとしています。理想的には、許可として Double と Decimals の両方で使用できるように、これをジェネリックにしたいと考えていMath.Round()ます。

以下に記述したコードは、どのオーバーロードを呼び出すかを知ることができないため、メソッドを (当然のことながら) 解決できないため、コンパイルされません。これはどのように達成されますか?

internal static T? RoundNullable<T>(T? nullable, int decimals) where T : struct
{
    Type paramType = typeof (T);

    if (paramType != typeof(decimal?) && paramType != typeof(double?))
        throw new ArgumentException(string.Format("Type '{0}' is not valid", typeof(T)));

    return nullable.HasValue ? Math.Round(nullable.Value, decimals) : (T?)null; //Cannot resolve method 'Round(T, int)'
 }
4

2 に答える 2

7

これはどのように達成されますか?

個人的には、私はあなたのジェネリックメソッドを取り除くでしょう。とにかく、2つの型引数に対してのみ有効です。2つのオーバーロードを持つオーバーロードされたメソッドに分割します。

internal static double? RoundNullable(double? nullable, int decimals)
{
    return nullable.HasValue ? Math.Round(nullable.Value, decimals)
                             : (double?) null;
}

internal static decimal? RoundNullable(decimal? nullable, int decimals)
{
    return nullable.HasValue ? Math.Round(nullable.Value, decimals)
                             : (decimal?) null;
}

汎用バージョンを使用する必要がある場合は、Daveの回答に従って条件付きで呼び出すか、リフレクションを使用して直接呼び出すか、dynamicC#4および.NET4を使用している場合に使用します。

于 2012-05-21T09:50:33.130 に答える
2

すでに型チェックを行っている場合は、コードフローでそれを使用するだけです。

if (paramType == typeof(decimal?))
...
    Math.Round((decimal)nullable.Value, decimals)
else if(paramType == typeof(double?))
    Math.Round((double)nullable.Value, decimals)
于 2012-05-21T09:50:11.533 に答える