Visual Studio 2017阻止调试器在Activator.CreateInstance中的异常停止

时间:2018-08-22 22:54:17

标签: c# system.reflection c#-7.0

我有一些代码尝试首先使用一个构造函数创建一个对象,然后尝试使用默认的构造函数创建一个对象,

MyClass Construct(MyField f1, MyField f2) 
{
    try 
    {
        return (MyClass)Activator.CreateInstance(typeof(MyClass), f1, f2);
    }
    catch 
    {
        var o = (MyClass)Activator.CreateInstance(typeof(MyClass)); 
        o.f1= f1; 
        o.f2=f2;
        return o;
    }
}

我想防止调试器在捕获到异常后停止。我尝试[DebuggerStepThrough][DebuggerHidden][DebuggerNonUserCode]时没有碰运气。

我也尝试按照建议here跑步:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VsRegEdit.exe" set "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community" HKLM Debugger\Engine AlwaysEnableExceptionCallbacksOutsideMyCode dword 1,但是没有运气。

在VS2017中有什么方法可以做到这一点吗?另外,是否有一种方法可以使用Activator.CreateInstance来返回null而不抛出异常?

(使用Visual Studio 2017 15.8.0预览版4.0)

1 个答案:

答案 0 :(得分:3)

一种快速而讨厌的方法是寻找构造函数GetConstructors并查看GetParameters的数量,然后相应地分支。

var ctors = typeof(A).GetConstructors();
// assuming class A has only one constructor
var ctor = ctors[0];
foreach (var param in ctor.GetParameters())
{
    Console.WriteLine(string.Format(
        "Param {0} is named {1} and is of type {2}",
        param.Position, param.Name, param.ParameterType));
}

再一次,可能会有更好的方法来执行此操作。但是,至少您没有使用异常来控制应用程序的流程。

如果您知道类的类型,则还可以比较类型。或者,如果您正在使用基类或接口,则可以使用具有约束的泛型。这很大程度上取决于我们看不到的内容以及为什么