2

我正在尝试编写一个NullObject创建方法,在其中我传入一个实现ICreateEmptyInstance接口(即为空)的类名,它会遍历它的属性以寻找其他实现的类ICreateEmptyInstance并将创建这些类的“Null”实例。

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>();

我遇到问题的地方是在 foreach 循环内,这条线

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

...显然这不起作用,但我怎样才能完成创建一个“空对象”来分配给我当前正在创建的实例。

编辑:那泛型呢?我想创建空实例

  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);
  }
4

1 回答 1

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;
}
于 2013-10-03T15:04:34.247 回答