Chciałbym wiedzieć, czy istnieje "bezpieczny" sposób konwersji obiektu na unikanie wyjątków.Czy istnieje próba Convert.ToInt32 ... unikanie wyjątków
Szukam czegoś takiego jak public static bool TryToInt32 (wartość obiektu, out int result);
Wiem, że mógłbym zrobić coś takiego:
public static bool TryToInt32(object value, out int result)
{
try
{
result = Convert.ToInt32(value);
return true;
}
catch
{
result = 0;
return false;
}
}
ale wolałbym uniknąć wyjątków, ponieważ spowalnia proces.
Myślę, że to jest bardziej eleganckie, ale wciąż "tanie".
public static bool TryToInt32(object value, out int result)
{
if (value == null)
{
result = 0;
return false;
}
return int.TryParse(value.ToString(), out result);
}
Ktoś ma lepszy pomysł?
UPDATE:
To brzmi trochę jak szukanie włosia przecinania. Jednak konwersja obiektu na ciąg zmusza programistę do utworzenia przejrzystej funkcji ToString().
na przykład:
public class Percentage
{
public int Value { get; set; }
public override string ToString()
{
return string.Format("{0}%", Value);
}
}
Percentage p = new Percentage();
p.Value = 50;
int v;
if (int.TryParse(p.ToString(), out v))
{
}
To się nie uda, można zrobić dwie rzeczy tutaj, albo wdrożyć IConvertable jak poniżej.
public static bool ToInt32(object value, out int result)
{
if (value == null)
{
result = 0;
return false;
}
if (value is IConvertible)
{
result = ((IConvertible)value).ToInt32(Thread.CurrentThread.CurrentCulture);
return true;
}
return int.TryParse(value.ToString(), out result);
}
Ale nie można anulować ToInt32 z IConvertible. Więc jeśli nie jest to możliwe, wyjątku nie da się uniknąć.
lub dwa: Czy istnieje sposób sprawdzenia, czy obiekt zawiera niejawny operator?
To jest bardzo słaba:
if (value.GetType().GetMethods().FirstOrDefault(method => method.Name == "op_Implicit" && method.ReturnType == typeof(int)) != null)
{
result = (int)value;
return true;
}
Dlaczego otaczasz TryParse? –
TryParse ma parametr a string. –
Chcę używać wyjątku tylko wtedy, gdy się go nie spodziewam. Tutaj parametrem może być cokolwiek. To jest POV, z którego pracuję. –