相关疑难解决方法(0)

.NET反射的代价是多少?

我经常听到反射的糟糕程度.虽然我一般都避免反思,很少发现没有它就无法解决问题的情况,我想知道......

对于那些在应用程序中使用过反射的人,你是否测量过性能命中率,是否真的如此糟糕?

.net c# reflection performance

204
推荐指数
8
解决办法
6万
查看次数

将字符串转换为可空类型(int,double等...)

我正在尝试进行一些数据转换.不幸的是,大部分数据都是字符串,它应该是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?'

有没有解决的办法?我不太熟悉使用泛型创建方法.

.net c# generics extension-methods type-conversion

135
推荐指数
8
解决办法
12万
查看次数

属性或索引器不能作为out或ref参数传递

我收到上述错误,无法解决.我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)

其他一切工作正常,层之间的引用存在.

.net c# error-handling

73
推荐指数
6
解决办法
7万
查看次数

TryParse为可空类型

我想尝试将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)

这是唯一的方法吗?

.net c# null nullable tryparse

14
推荐指数
2
解决办法
9651
查看次数

如何在动态类型的C#4.0中调用静态方法?

在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的引入并不那么令人印象深刻.

.net c# dynamic c#-4.0

13
推荐指数
3
解决办法
9631
查看次数

如何动态调用TryParse?

有没有办法TryParse动态调用?一些:

public static bool TryParse<T>(string toConvert, out T result)
Run Code Online (Sandbox Code Playgroud)

当然可以使用Typeonverters.但是,无效的转换将导致异常,我想摆脱这个.

.net c# type-conversion

9
推荐指数
1
解决办法
5211
查看次数

更优雅的方法,找出我是否可以将值转换为某种类型

我正在使用一些遗留代码,它们通常使用try+ catchConvert.ToDecimal(someString)(例如)结合使用来尝试将字符串转换为小数.出于某些原因,我必须使用这样的设置 - 在调试时 - 我停在每个抛出的异常(不仅是用户未处理的异常),所以这很烦人,我改变它以TryParse尽可能使用方法.

现在我处在一个object有价值和目标的情况下Type,我想知道的是我是否可以值转换为目标类型.现在这样做如下:

try
{
  Convert.ChangeType(val, targetType);
}
catch
{
  // Do something else
}
Run Code Online (Sandbox Code Playgroud)

实际结果并不重要,不再使用.

虽然这个代码现在正在运行,正如我所说,它有点烦人,所以我想知道:有没有其他方法可以做到上述而不必捕获异常?

我想到了类似于IsAssignableFroma 的东西Type,但这似乎并不适用于我的情况(我不想分配,我想知道是否可以明确转换).

c# reflection casting

6
推荐指数
1
解决办法
168
查看次数

使用连续的TryParse调用是一种猜测字符串'真实类型'的有效方法吗?

这涉及到我有没有使用T4生成类的项目模板?题.我有nvarchar生成正确类型的类属性所需的string()参数值列表.

该值是所有原始数据-最复杂的存在DateTime-在集合{ int,double,bool,DateTime}.目前我有一个手工编码的类型属性中的一个 - 这样的列表,并解析我开始的字符串DateTime.TryParseExact.如果失败了,我试试Double.TryParse,在底部我放弃猜测并假设它真的是一个字符串.

这是一个相当合理的方法,还是我应该使用其他更复杂或更准确的方法?

.net c#

5
推荐指数
1
解决办法
183
查看次数

如何在try-catch块中正确放置语句?

我需要一个接一个地执行大量语句,并且我需要在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)

c# exception try-catch func

5
推荐指数
1
解决办法
271
查看次数

C#动态解析用户输入为string,int,double,decimal,datetime,bool等

如何动态解析用户输入的值到某种类型?

如果我有一个文本框,用户可以输入他们想要的内容,我该如何动态解析该值并返回相应的类型?

 public dynamic ParseValue(dynamic value)
 {
     return //TO DO
 }
Run Code Online (Sandbox Code Playgroud)

如果用户输入以下值:

  • 06.18.2015 10:23:00 //返回DateTime
  • 一些文字//返回字符串
  • 10.23 //返回双精度/小数
  • true/True/false/False //返回bool而不是字符串
  • 10 //返回int

这是使用type.TryParse的正确方法,并检查每种类型是否有效?当然,我必须首先检查它是否是bool然后是字符串,否则如果该值true/True/false/False将导致字符串而不是bool.

c#

2
推荐指数
1
解决办法
2251
查看次数