我经常听到反射的糟糕程度.虽然我一般都避免反思,很少发现没有它就无法解决问题的情况,我想知道......
对于那些在应用程序中使用过反射的人,你是否测量过性能命中率,是否真的如此糟糕?
我正在尝试进行一些数据转换.不幸的是,大部分数据都是字符串,它应该是int或double等等......
所以我得到的是:
double? amount = Convert.ToDouble(strAmount);
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是如果strAmount是空的,如果它是空的我希望它等于null,所以当我将它添加到数据库时,该列将为null.所以我最后写了这个:
double? amount = null;
if(strAmount.Trim().Length>0)
{
amount = Convert.ToDouble(strAmount);
}
Run Code Online (Sandbox Code Playgroud)
现在这个工作正常,但我现在有五行代码而不是一行代码.这使得事情变得更难以阅读,特别是当我有大量的列要转换时.
我以为我会使用字符串类和泛型的扩展来传入类型,这是因为它可能是double,或int或long.所以我尝试了这个:
public static class GenericExtension
{
public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
{
if (s.Trim().Length > 0)
{
return (Nullable<T>)s;
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到错误:无法将类型'string'转换为'T?'
有没有解决的办法?我不太熟悉使用泛型创建方法.
我收到上述错误,无法解决.我google了一下,但无法摆脱它.
场景:
我有类BudgetAllocate,其属性是预算,是双重类型.
在我的dataAccessLayer中,
在我的一个课程中,我试图这样做:
double.TryParse(objReader[i].ToString(), out bd.Budget);
Run Code Online (Sandbox Code Playgroud)
这引发了这个错误:
在编译时,属性或索引器不能作为out或ref参数传递.
我甚至试过这个:
double.TryParse(objReader[i].ToString().Equals(DBNull.Value) ? "" : objReader[i].ToString(), out bd.Budget);
Run Code Online (Sandbox Code Playgroud)
其他一切工作正常,层之间的引用存在.
我想尝试将a解析string为a DateTime?,如果失败则将值设置为null.我能想到的唯一方法就是如下,但它看起来并不是很整洁.
DateTime temp;
DateTime? whatIActuallyWant = null;
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp;
Run Code Online (Sandbox Code Playgroud)
这是唯一的方法吗?
在C#4.0中,我们有动态类型,但是如何调用动态类型对象的静态方法?
下面的代码将在运行时生成异常.该动态对象是从C#类,但它可能是从通过DLR其他语言的对象.关键不在于如何调用静态方法,而是如何调用无法在C#代码中创建的动态对象的静态方法.
class Foo
{
public static int Sum(int x, int y)
{
return x + y;
}
}
class Program
{
static void Main(string[] args)
{
dynamic d = new Foo();
Console.WriteLine(d.Sum(1, 3));
}
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,动态是发明桥接C#和其他编程语言.还有一些其他语言(例如Java)允许通过对象而不是类型来调用静态方法.
顺便说一下,与C#3.0相比,C#4.0的引入并不那么令人印象深刻.
有没有办法TryParse动态调用?一些:
public static bool TryParse<T>(string toConvert, out T result)
Run Code Online (Sandbox Code Playgroud)
当然可以使用Typeonverters.但是,无效的转换将导致异常,我想摆脱这个.
我正在使用一些遗留代码,它们通常使用try+ catch与Convert.ToDecimal(someString)(例如)结合使用来尝试将字符串转换为小数.出于某些原因,我必须使用这样的设置 - 在调试时 - 我停在每个抛出的异常(不仅是用户未处理的异常),所以这很烦人,我改变它以TryParse尽可能使用方法.
现在我处在一个object有价值和目标的情况下Type,我想知道的是我是否可以将值转换为目标类型.现在这样做如下:
try
{
Convert.ChangeType(val, targetType);
}
catch
{
// Do something else
}
Run Code Online (Sandbox Code Playgroud)
实际结果并不重要,不再使用.
虽然这个代码现在正在运行,正如我所说,它有点烦人,所以我想知道:有没有其他方法可以做到上述而不必捕获异常?
我想到了类似于IsAssignableFroma 的东西Type,但这似乎并不适用于我的情况(我不想分配,我想知道是否可以明确转换).
这涉及到我有没有使用T4生成类的项目模板?题.我有nvarchar生成正确类型的类属性所需的string()参数值列表.
该值是所有原始数据-最复杂的存在DateTime-在集合{ int,double,bool,DateTime}.目前我有一个手工编码的类型属性中的一个 - 这样的列表,并解析我开始的字符串DateTime.TryParseExact.如果失败了,我试试Double.TryParse,在底部我放弃猜测并假设它真的是一个字符串.
这是一个相当合理的方法,还是我应该使用其他更复杂或更准确的方法?
我需要一个接一个地执行大量语句,并且我需要在sigle语句抛出异常时,程序流继续执行下一个语句,例如:
double a = Double.Parse("2.5");
double b = Double.Parse("ADFBBG");
Geometry g = Geometry.Parse("M150,0L75,200 225,200z");
Run Code Online (Sandbox Code Playgroud)
所有语句都必须执行,所以我需要一种级联的try-catch块:
double a, b;
Geometry g;
try
{
a = Double.Parse("2.5");
}
catch
{}
try
{
b = Double.Parse("ADFBBG");
}
catch
{}
try
{
g = Geometry.Parse("M150,0L75,200 225,200z");
}
catch
{}
Run Code Online (Sandbox Code Playgroud)
显然,这不是编写程序的最优雅方式.有更好的方法(更优雅,不会显着降低性能)?
我尝试Func<TResult>以这种方式使用委托:
我写了以下方法:
T Try<T>(Func<T> func)
{
try
{
return func();
}
catch
{
return default(T);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以像这样使用它:
double x = Try(() => Double.Parse("77"));
Geometry g = Try(() => …Run Code Online (Sandbox Code Playgroud) 如何动态解析用户输入的值到某种类型?
如果我有一个文本框,用户可以输入他们想要的内容,我该如何动态解析该值并返回相应的类型?
public dynamic ParseValue(dynamic value)
{
return //TO DO
}
Run Code Online (Sandbox Code Playgroud)
如果用户输入以下值:
这是使用type.TryParse的正确方法,并检查每种类型是否有效?当然,我必须首先检查它是否是bool然后是字符串,否则如果该值true/True/false/False将导致字符串而不是bool.