Ana*_*nyi 3 c# generics type-conversion
我的任务是编写一个StringToType()方法,将字符串转换为指定的类型T.
但我不喜欢我实现方法StringToType()的方式.我想使用少于反射并尽可能确保性能.
请告知如何最好地实施/更改它.
class Program
{
static bool StringToType<T>(string str, ref T value)
{
Type typeT = typeof(T);
bool isSuccess = false;
if (typeT.GetInterface("IConvertibleFromString") != null)
{
return (bool)typeT.GetMethod("FromString").Invoke(value, new object[] { str });
}
else if (typeT.IsEnum)
{
MethodInfo methodTryParse = typeT.GetMethod("TryParse").MakeGenericMethod(typeT);
return (bool)methodTryParse.Invoke(null, new object[] { str, value });
}
else if (typeT.IsPrimitive)
{
value = (T)Convert.ChangeType(str, typeT);
return true;
}
return isSuccess;
}
static void Main(string[] args)
{
string intStr = "23";
int val1 = 0;
bool res = StringToType<int>(intStr, ref val1);
Class1 c1;
res = StringToType<Class1>(intStr, ref c1);
Console.ReadKey();
}
}
interface IConvertibleFromString
{
bool FromString(string str);
}
class MySomeClass : IConvertibleFromString
{
int someVal;
public bool FromString(string str)
{
return int.TryParse(str, out someVal);
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎对我来说是最好的.与各种消费者共同投入了一百万次.这是人们评论的结合,还有一些额外的评论.
static Boolean TryParseString<T>(
String stringValue, ref T value)
{
Type typeT = typeof(T);
if (typeT.IsPrimitive)
{
value = (T)Convert.ChangeType(stringValue, typeT);
return true;
}
else if (typeT.IsEnum)
{
value = (T)System.Enum.Parse(typeT, stringValue); // Yeah, we're making an assumption
return true;
}
else
{
var convertible = value as IConvertible;
if (convertible != null)
{
return convertible.FromString(stringValue);
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)