[英]Reflection does not trigger parameterized constructor c#
我正在尝试使用Activator.CreateInstance
初始化一个类,其中相应的类具有三个构造函数,如下所示,当我尝试通过在Activator.CreateInstance
方法中传递bool
值来创建实例时,它抛出错误No parameterless constructor defined for this object but it成功为string
或int
数值创建类实例。
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.