2013-10-03 3 views
2

Я пытаюсь написать метод создания NullObject, где я передаю имя класса, которое реализует интерфейс ICreateEmptyInstance (который пуст), и он просматривает его свойства, ища другие классы, реализующие ICreateEmptyInstance, и создаст «Нулевые» экземпляры этих.Создание объектов с отражением

public interface ICreateEmptyInstance { } 

public static class NullObject 
{ 
    public static T Create<T>() where T : ICreateEmptyInstance, new() 
    { 
     var instance = new T(); 

     var properties = typeof(T).GetProperties(); 
     foreach (var property in properties.Where(property => typeof(ICreateEmptyInstance).IsAssignableFrom(property.PropertyType))) 
     { 
      var propertyInstance = NullObject.Create<property.PropertyType>(); 
      property.SetValue(instance, propertyInstance); 
     } 

     return instance; 
    } 
} 

я должен быть в состоянии назвать его этим

var myEmptyClass = NullObject.Create<MyClass>(); 

Где у меня проблемы находится внутри цикла Еогеасп, с этой линией

var propertyInstance = NullObject.Create<property.PropertyType>(); 

... Очевидно, это не работает, но как я могу создать создание «нулевого объекта» для назначения экземпляру, который я сейчас создаю.

EDIT: А как насчет дженериков? Я хотел бы пустые экземпляры, созданные

foreach (var property in properties.Where(property => property.GetType().IsGenericType)) 
    { 
     var propertyInstance = Enumerable.Empty<>(); //TODO: how do I get the type for here? 
     property.SetValue(instance, propertyInstance); 
    } 
+0

возможно дубликат [Получить новый экземпляр объекта из Type] (HTTP: // stackoverflow.com/questions/752/get-a-new-object-instance-from-a-type) –

ответ

5

Вы можете создать не-шаблонный метод и использовать его:

public static T Create<T>() where T : ICreateEmptyInstance, new() 
{ 
    return (T) Create(typeof (T)); 
} 

private static object Create(Type type) 
{ 
    var instance = Activator.CreateInstance(type); 

    var properties = type.GetProperties(); 
    foreach (var property in properties.Where(property => typeof(ICreateEmptyInstance).IsAssignableFrom(property.PropertyType))) 
    { 
     var propertyInstance = NullObject.Create(property.PropertyType); 
     property.SetValue(instance, propertyInstance); 
    } 

    return instance; 
} 
+0

Это выглядит хорошо, но я получил исключение переполнения стека! цикл создавал неправильный тип, я думаю, теперь, чтобы проверить это. – CaffGeek

+0

Извините, я запечатал. –

+0

как насчет коллекций? любые мысли о том, как обеспечить, чтобы экземпляр имел свои свойства списка, созданные с пустыми списками? – CaffGeek

Смежные вопросы