2014-01-09 17 views
-1

我有这样的方法,我想用回我已经通过传递类型名称创建一个对象:试图找回我的对象​​C#,当这个对象定义无参数的构造函数

public object GetObjectType(object objectTypeName) 
{ 
    Type objecType = objectTypeName.GetType(); 
    return Activator.CreateInstance(objecType); 
} 

当我做到这一点:

var a = GetObjectType("Person"); 

我得到:No parameterless constructor defined for this object.

林也不太清楚这是什么CreateInstance这样做IM盲目飞行这里。 我需要的东西添加到我的类,它看起来像这样:

public class Person 
{ 
    public string Name {get; set;} 
} 
+3

是整个'Person'类,完全按照你这样来定义? –

+2

错误似乎很清楚,在Person上定义了哪些构造函数? – David

+0

您可能有一个带参数的构造函数,在这种情况下,默认的无参数构造函数不会自动实现。 –

回答

0

这里是我已经解决了这个问题:

Type objectType = Type.GetType("MyProject.Models.Person", true); 
Object objectTypeInstance = (Activator.CreateInstance(objectType)); 

现在我可以取回我的对象​​

5

事实上,你要创建的字符串类型,它的确没有一个参数的构造器的新实例。

public object GetObjectType(object objectTypeName) 
{ 
    Type objecType = objectTypeName.GetType(); // objecType is String here 
    return Activator.CreateInstance(objecType); // creation of String fails 
} 

你可能真的想要做的是这样的:

public object GetObjectType(string objectTypeName) 
{ 
    Type objecType = Type.GetType(objectTypeName); 
    return Activator.CreateInstance(objecType); 
} 
+0

'类型objecType = Type.GetType(objectTypeName);'给null? –

+0

@MikeBarnes,这是一个不同的故事 - 您可能需要一个完全限定的名称(如果在不同的名称空间中)或程序集(如果在不同的程序集中)。看看[这个线程](http://stackoverflow.com/questions/223952/c-sharp-create-an-instance-of-a-class-from-a-string)更多的选择,让我觉得第二个答案migth是你最好的选择。至少现在你在创建你需要的实际类型时有错误。 – Andrei

+0

好酷谢谢,非常有帮助 –

3

尝试添加一个参数的构造函数:

public class Person 
{ 
    public string Name {get; set;} 

    public Person() {} // Parameterless constructor 
} 
+0

这可能值得注意*为什么* Activator.CreateInstance可能需要一个无参数的构造函数。 –

+7

仅供参考 - 只需测试它,除非*还有参数化的构造函数,否则不需要显式地使用无参数的构造函数。没有构造函数算作无参数。 –

0

看来你正试图不通过参数来创建对象到可用的参数化构造函数你有。试试这个:

public object GetObjectType(object objectTypeName) 
{ 
    Type objecType = objectTypeName.GetType(); 
    //ur code works fine if do not have parameterised constructor 
    return Activator.CreateInstance(objecType,"(do not forget to pass arguments)"); 
} 
+1

这将导致带有“(不要忘记传递参数)”的“string”类型的实例。 – abto

相关问题