Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用泛型类型验证变量_C# - Fatal编程技术网

C# 如何使用泛型类型验证变量

C# 如何使用泛型类型验证变量,c#,C#,我有以下方法来验证类型: Boolean valid = Int32.TryParse(value, out result); 如何使用TryParse进行泛型?例如: public Boolean Validate<T>(Object value) { // Get TryParse of T type and check if value is of that type. } 公共布尔验证(对象值){ //获取T类型的TryParse并检查值是否为该类型。 } 如何验证

我有以下方法来验证类型:

Boolean valid = Int32.TryParse(value, out result);
如何使用TryParse进行泛型?例如:

public Boolean Validate<T>(Object value) {
  // Get TryParse of T type and check if value is of that type.
}
公共布尔验证(对象值){
//获取T类型的TryParse并检查值是否为该类型。
}

如何验证值以检查其是否为T类型?

您可以使用反射来获取
TryParse
的正确重载并调用它:

public static bool Validate<T>(string value)
{
   var flags = BindingFlags.Public | BindingFlags.Static;
   var method = typeof(T).GetMethod(
            "TryParse",
            flags,
            null,
            new[] { typeof(string), typeof(T).MakeByRefType() },
            null);
    if (method != null)
    {
         T result = default(T);
         return (bool)method.Invoke(null, new object[] { value, result });
    }
    else
    {
        // there is no appropriate TryParse method on T so the type is not supported
    }
}
公共静态bool验证(字符串值)
{
var flags=BindingFlags.Public | BindingFlags.Static;
var method=typeof(T).GetMethod(
“锥虫”,
旗帜,
无效的
新[]{typeof(string),typeof(T).MakeByRefType()},
无效);
if(方法!=null)
{
T结果=默认值(T);
return(bool)method.Invoke(null,新对象[]{value,result});
}
其他的
{
//T上没有合适的TryParse方法,因此不支持该类型
}
}
用法如下所示:

bool isValid = Validate<double>("12.34");
bool isValid=Validate(“12.34”);

并非所有数据类型都实现parse或tryparse方法。但是,许多类型都有关联的TypeConverter,您可以使用它来尝试从字符串转换

public Boolean Validate<T>(string value) 
{
     var converter = TypeDescriptor.GetConverter(typeof(T));
     return converter != null ? converter.IsValid(value) : false;
}
公共布尔值验证(字符串值)
{
var converter=TypeDescriptor.GetConverter(typeof(T));
返回转换器!=null?转换器.IsValid(值):false;
}

如果您在运行时之前不知道实际类型(通常是在出现此类问题时),您将如何合理地使用这些信息?我想您的意思是,如果您的值参数是StringType,我是否应该检查转换器是否存在?你说很多类型的人。。。不是全部。我添加了一个检查转换器是否存在。与寻找解析方法相比,这种技术应该能够从字符串转换更多类型。另一种技术是使用System.Convert类,但同样,这不会涵盖那么多类型。