The System.MemberAccessException
with the message “Cannot create an instance of type ‘xyz'” occurs in C# when you attempt to create an instance of a type, but the runtime is unable to do so. This typically happens due to restrictions on the type, such as it being abstract, an interface, or lacking a parameterless constructor.
Common Causes and Solutions
- Abstract Classes or Interfaces:
You cannot create an instance of an abstract class or an interface.
public abstract class Example { }
var instance = Activator.CreateInstance(typeof(Example)); // MemberAccessException – Cannot instantiate abstract class
Fix: Instantiate a concrete subclass instead.
public class ConcreteExample : Example { }
var instance = Activator.CreateInstance(typeof(ConcreteExample)); // Works correctly
- No Parameterless Constructor:
If the type does not have a parameterless constructor and you attempt to create an instance without providing arguments, this exception will occur.
public class Example
{
public Example(string message) { }
}
var instance = Activator.CreateInstance(typeof(Example)); // MemberAccessException – No parameterless constructor
Fix: Provide the required constructor arguments.
var instance = Activator.CreateInstance(typeof(Example), "Hello"); // Works correctly
- Private or Internal Constructors:
If the constructor is private or internal and you do not have the necessary permissions to access it, this exception can occur.
public class Example
{
private Example() { }
}
var instance = Activator.CreateInstance(typeof(Example)); // MemberAccessException – Cannot access private constructor
Fix: Use reflection with BindingFlags
to access non-public constructors.
var constructor = typeof(Example).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
var instance = constructor.Invoke(null); // Works correctly
- Generic Types:
If you attempt to create an instance of an open generic type (without specifying type arguments), this exception will occur.
public class Example<T> { }
var instance = Activator.CreateInstance(typeof(Example<>)); // MemberAccessException – Cannot instantiate open generic type
Fix: Provide the type arguments for the generic type.
var instance = Activator.CreateInstance(typeof(Example<int>)); // Works correctly
- Static Classes:
You cannot create an instance of a static class.
public static class Example { }
var instance = Activator.CreateInstance(typeof(Example)); // MemberAccessException – Cannot instantiate static class
Fix: Static classes cannot be instantiated. Use the class directly.
Example.SomeMethod(); // Use the static class directly
- Type Initialization Issues:
If the type’s static constructor or initialization logic throws an exception, this can prevent the type from being instantiated.
public class Example
{
static Example() => throw new Exception("Static constructor failed");
}
var instance = Activator.CreateInstance(typeof(Example)); // MemberAccessException – Type initialization failed
Fix: Fix the static constructor or initialization logic.
public class Example
{
static Example() { /* Fix the logic */ }
}
- Restricted Types:
Certain types, such asSystem.Void
or pointer types, cannot be instantiated.
var instance = Activator.CreateInstance(typeof(void)); // MemberAccessException – Cannot instantiate void
Fix: Avoid attempting to instantiate restricted types.