C# 考虑货币符号的数字通用转换

C# 考虑货币符号的数字通用转换,c#,type-conversion,C#,Type Conversion,假设采用以下方法: public static bool IsNumber<T>(string number) where T : struct ... try { var numberConverted = (T) Convert.ChangeType(text, typeof(T)); return true; } catch (... 公共静态bool IsNumber(字符串编号),其中T:struct。。。 尝试 { var numberConverted=(

假设采用以下方法:

public static bool IsNumber<T>(string number) where T : struct ...
try
{
   var numberConverted = (T) Convert.ChangeType(text, typeof(T));
   return true;
}
catch (...
公共静态bool IsNumber(字符串编号),其中T:struct。。。
尝试
{
var numberConverted=(T)Convert.ChangeType(text,typeof(T));
返回true;
}
捕获(。。。
我们的想法是这样称呼它:

var number = "$1,123.00";
var numberOk = IsNumber<decimal>(number);
var number=“$1123.00”;
var numberOk=IsNumber(编号);
问题是,无论如何,我都找不到一种方法来转换.ChangeType以接受带有货币符号的数字(已尝试传递
IFormatProvider
,但没有成功)

使用
Convert.ChangeType
时,是否有方法指定
numberstyle
,或者其他方法,允许我使用方法
IsNumber
,即使要检查的字符串有货币符号

编辑2016年7月3日UTC晚上9点:

其思想是,此方法验证类型
T
所需的所有内容。如果我输入一个简单的
decimal.Parse
并包含
NumberStyles.Currency
参数,它将不会验证
number
是否为整数且不应包含小数,或者
number
是否为
float
和minimum和maximum值与
decimal
的值不同。换句话说,在全局通用解决方案中,我无法访问类似
Parse
的方法或接受
numberstyle
参数的方法


这个编辑是为了解释为什么我认为这不是问题的重复。在我的特定场景中,我要求它只适用于内置的.Net类型。每个数字类型都有一个
Parse
方法,正如注释中指出的,
Parse
有一个重载,它接受
NumberStyles
参数。Also、 重要的是要注意,
Convert.ChangeType
仅适用于内置.Net类型中非常有限的子集,正如注释中所指出的。感谢宝贵的注释

现在是可行的解决方案,我刚刚使用一些反射对
IsNumber
方法进行了一些调整:

public static bool IsNumber<T>(string number, NumberStyles numberStyle) where T : struct ...
try
{
    var mi = typeof(T).GetMethod("Parse", new Type[] {typeof(string), typeof(NumberStyles)});
    if (mi == null)
        return false;
    var parsed = mi.Invoke(null, new object[] {number, numberStyle});
    return true;
}
catch (...
公共静态bool IsNumber(字符串编号,NumberStyles numberStyle),其中T:struct。。。
尝试
{
var mi=typeof(T).GetMethod(“Parse”,新类型[]{typeof(string),typeof(NumberStyles)});
if(mi==null)
返回false;
var parsed=mi.Invoke(null,新对象[]{number,numberStyle});
返回true;
}
捕获(。。。
方法的调用应类似于:

var number = "$1,123.00";
var numberOk = IsNumber<decimal>(number, NumberStyles.Currency);
var number=“$1123.00”;
var numberrok=IsNumber(number,NumberStyles.Currency);

@Stijn的可能重复项我没有看到重复项,该问题特别指出将货币文本解析为十进制类型的问题,我要求的是全局解决方案(不仅仅是十进制类型),在这种情况下,我没有
Parse
方法来给出
NumberStyles
你并不真的相信
Convert.ChangeType
一般适用于每种类型,对吗?它只支持一些系统值类型和字符串。不,它不会。请参阅和。记住,在这种情况下,活动类是
string
。你真的吗我必须创建自己的方法。@IvanStoev我喜欢Microsoft Refence源代码是如何毫无疑问的(:-谢谢你启发我。无论如何,即使只有内置类型支持
Convert.ChangeType
,它也能满足我的需要,如果它们都支持的话(字符串除外)有一个
Parse
方法。将使用此
Parse
解决方案编辑答案,因为它解决了我的问题。