c# - Visual Studio 2017 阻止调试器在 Activator.CreateInstance 异常时停止

标签 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] 但没有成功。

我还尝试运行:"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但没有运气。

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

(使用visual studio 2017 15.8.0 preview 4.0)

最佳答案

一种快速而讨厌的方法是寻找构造函数,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));
}

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

如果您知道类的类型,您还可以比较类型。或者,如果您使用的是基类或接口(interface),则可以使用带有约束的泛型。这在很大程度上取决于我们看不到的东西和原因

关于c# - Visual Studio 2017 阻止调试器在 Activator.CreateInstance 异常时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976234/

相关文章:

c# - 如何在c#中的字符串中追加“

c# - 序列化继承 : Will an exception be thrown if the base class isn't marked [Serializable]?

javascript - 我必须编写正则表达式,只允许 @#$% 作为特殊符号,而不允许其他符号,例如 ?><`~ 符号

c# - 是否有可以与传入的 KeyEventArgs 匹配的热键的 .NET 类?

c# - 为什么 CLR 允许改变装箱的不可变值类型?

C# 如何检查空值。 (值为空)或(空 == 值)。我们可以使用 `is` 运算符而不是 == 运算符吗

func - 动态创建 Func<T, TKey>

c# - 如何在不使用 C# 反射的情况下从该方法内部获取方法名称

c# - 如何将 PropertyInfo 转换为属性表达式并使用它来调用泛型方法?

c# - ref T 索引器和 get/set 索引器之间有区别吗?