Érdeklődni szeretnék, hogy van-e "biztonságos" módszer egy objektum int
-re való konvertálására, elkerülve a kivételeket.
olyasmit keresek, mint public static bool TryToInt32(object value, out int result);
Tudom, hogy valami ilyesmit tudnék készíteni:
public static bool TryToInt32(object value, out int result)
{
try
{
result = Convert.ToInt32(value);
return true;
}
catch
{
result = 0;
return false;
}
}
De inkább kerülöm a kivételeket, mert lassítják a folyamatot.
Szerintem ez elegánsabb, de így is "olcsó":
public static bool TryToInt32(object value, out int result)
{
if (value == null)
{
result = 0;
return false;
}
return int.TryParse(value.ToString(), out result);
}
Van valakinek jobb ötlete?
FRISSÍTÉS:
Ez kicsit úgy hangzik, mint a szőrszálak felhasítása, de egy objektum karakterláncsá alakítása arra kényszeríti az implementálót, hogy tiszta ToString()
függvényt hozzon létre. Például:
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))
{
}
Ez rosszul sül el, itt két dolgot tehetek, vagy a következőképpen valósíthatom meg a IConvertable
-et:
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);
}
De a IConvertible
ToInt32
metódusát nem lehet törölni. Tehát ha nem lehetséges az érték konvertálása, nem kerülhető el a kivétel.
Vagy kettő: Van mód annak ellenőrzésére, hogy az objektum tartalmaz-e implicit operátort?
Ez nagyon szegényes:
if (value.GetType().GetMethods().FirstOrDefault(method => method.Name == "op_Implicit" && method.ReturnType == typeof(int)) != null)
{
result = (int)value;
return true;
}
int variable=int.TryParse(stringValue, out variable) ? variable : 0
21.08.2014int.TryParse(myObject.Tostring() , out result)
-t hívja, az továbbra is működne minden (nem nulla) értéknél. A null értékekre kapott Nullreference kivételnek semmi köze a TryParse-hoz, inkább a .ToString() meghívásához. 10.01.2017stringValue
egyenlő 0-val, akkor a rendszer sikeresen értelmezi, és avariable
továbbra is0
lesz. Ellenőrizze aTryParse
visszatérési értékét. 03.09.2018