Roundcrisis

home about talks rss feed  rss

Reflection - Create an instance of a class through a protected method

16 Sep 2010

I had a bit of trouble getting to this, so for self reference more than anything, I thought I d post about it.

Given the following class

    	
public class MyClass
{
private string _name;

public string Name { get { return this._name;}}

protected MyClass(string name)
{
_name = name;
}
}

I thought that the following would be the way to create an instance of it:

    Activator.CreateInstance(typeof(MyClass), BindingFlags.NonPublic, null, new object[] { "MyName" }, CultureInfo.CurrentCulture);
However it throws a MissingMethodException: Constructor on type 'ReflectionCreateInstance.MyClass' not found. However if we add the Binding Flag for instance then it works.
    	
[Fact]
public void When_creating_with_activator_Must_use_apropriate_binding_flags()
{
string myname = "MyName";

var myClass = (MyClass)Activator.CreateInstance(
typeof(MyClass),
BindingFlags.Instance| BindingFlags.NonPublic,
null,
new object[] { myname },
CultureInfo.CurrentCulture);

Assert.Equal(myname, myClass.Name);
}
If you try this with <b>type.GetConstructor</b> or <b>type.GetConstructors </b>the result is the same. 


Checking the <a href="http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx" target="_blank">documentation for BindingFlag</a>.Instance I find </span>


<a href="http://roundcrisis.files.wordpress.com/2010/09/capture.png"><img src="http://roundcrisis.files.wordpress.com/2010/09/capture_thumb.png" style="display:inline;border-width:0;" title="Capture" height="370" width="674" alt="Capture" border="0"></img></a>

So it was a case of RTFM I guess :D
comments powered by Disqus