繁体   English   中英

反射不会触发参数化构造函数 c#

[英]Reflection does not trigger parameterized constructor c#

我正在尝试使用Activator.CreateInstance初始化一个类,其中相应的类具有三个构造函数,如下所示,当我尝试通过在Activator.CreateInstance方法中传递bool值来创建实例时,它抛出错误No parameterless constructor defined for this object but it成功为stringint数值创建类实例。

public class MyType
{
    //public MyType()
    //{

    //}

    public MyType(string value)
    {
        FlagString = value;
    }

    public MyType(int value)
    {
        FlagInt = value;
    }

    public MyType(bool value)
    {
        FlagBool = value;
    }

    public string FlagString { get; set; }
    public int FlagInt { get; set; }
    public bool FlagBool { get; set; }
}


class Program
    {
        static void Main(string[] args)
        {
          
            MyType stringVal = (MyType)Activator.CreateInstance(typeof(MyType), "Yes");
            string s = stringVal.FlagString;

            MyType intVal = (MyType)Activator.CreateInstance(typeof(MyType), 1);
            int s1 = stringVal.FlagInt;

            MyType boolValue = (MyType)Activator.CreateInstance(typeof(MyType), true); //Throws error
            bool s2 = stringVal.FlagBool;
        }
    }

我不知道为什么没有为 bool 值调用构造函数public MyType(bool value) ,请帮我解决这个问题。

这是因为Activator.CreateInstance的重载将bool作为第二个参数, 请参见此处 快速修复是将参数强制转换为object以强制它使用正确的重载:

MyType boolValue = (MyType)Activator.CreateInstance(typeof(MyType), (object)true);

或者将其作为数组传入:

MyType boolValue = (MyType)Activator.CreateInstance(typeof(MyType), new object[] {true});

您正在调用完全不同的重载。 如果要传入 bool 参数,请将其装箱或不隐式调用params并传递包含所需参数的对象数组。

您的调用现在解析为重载,其中 bool 参数意味着构造函数是否可以是非公开的。

检查文档可以很清楚地识别和理解问题。

您的代码无法编译,我假设:

MyType intVal = (MyType)Activator.CreateInstance(typeof(MyType), 1);
int s1 = stringVal.FlagInt;

MyType boolValue = (MyType)Activator.CreateInstance(typeof(MyType), true); //Throws error
int s2 = stringVal.FlagBool;

应该是这样的:

MyType intVal = (MyType)Activator.CreateInstance(typeof(MyType), 1);
int s1 = intVal.FlagInt;

MyType boolVal = (MyType)Activator.CreateInstance(typeof(MyType), true); //Throws error
bool s2 = boolVal.FlagBool;

现在关于你的问题,你打电话给Activator.CreateInstance(Type type, bool nonPublic); 尝试调用默认构造函数的重载。 但是您的类中没有默认构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM