代码之家  ›  专栏  ›  技术社区  ›  kofifus

Visual Studio 2017防止调试器在Activator.CreateInstance中出现异常时停止

  •  1
  • kofifus  · 技术社区  · 7 年前

    我有一些代码试图先用一个构造函数创建一个对象,然后,如果失败,用默认构造函数:

    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] 没有运气。

    我还试着跑: "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 按建议 here 但没有运气。

    Activator.CreateInstance 会回来的 null

    (使用visual studio 2017 15.8.0预览版4.0)

    1 回复  |  直到 7 年前
        1
  •  3
  •   TheGeneral    7 年前

    一个快速而恶劣的方法是寻找构造器, 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));
    }
    

    再说一次,可能有更好的方法来做到这一点。但是,至少您没有使用异常来控制应用程序的流。

    如果你知道你的类的类型,你也可以比较类型。或者如果使用基类或接口,则可以使用带约束的泛型。这很大程度上取决于我们看不到的东西和 为什么