Как вы получаете тип универсального аргумента из стекового кадра? - PullRequest
2 голосов
/ 15 ноября 2008

Мы должны создавать экземпляры наших сущностей через фабрику, поскольку они настроены по-разному на клиенте и сервере. Я хочу убедиться, что это так, но не могу заставить его работать.

public interface IEntityFactory
{
    TEntity Create<TEntity>() where TEntity : new();
}

public abstract class Entity
{
    protected Entity()
    {
        VerifyEntityIsCreatedThroughFactory();
    }

    [Conditional("DEBUG")]
    private void VerifyEntityIsCreatedThroughFactory()
    {
        foreach (var methodBase in new StackTrace().GetFrames().Select(x => x.GetMethod()))
        {
            if (!typeof(IEntityFactory).IsAssignableFrom(methodBase.DeclaringType)
                || methodBase.Name != "Create")
                continue;

            // The generic type is TEnitiy but I want the provided type!
            if (methodBase.GetGenericArguments()[0] != GetType())
                Debug.Fail(string.Format("Use factory when creating {0}.", GetType().Name));
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 15 ноября 2008

Возможно ли решить это структурно, а не во время выполнения? Можете ли вы разделить ваши сущности и фабрику в другой сборке, а затем дать конструкторам сущностей internal область действия, чтобы только фабрика могла их вызывать?

0 голосов
/ 15 ноября 2008

Спасибо за ваши ответы. Установка конструктора для внутреннего не возможна, так как у нас есть несколько сборок, содержащих сущности. Прямо сейчас я склоняюсь к созданию класса, в котором фабрика регистрирует тип для создания, а конструктор проверяет зарегистрированный тип, это не то решение, которое я бы предпочел, но пока оно будет.

0 голосов
/ 15 ноября 2008

Проблема заключается в том, что тип метода фабрики разрешается во время выполнения, поэтому метод считается «открытым». В этом случае универсальный тип аргумента будет возвращать TEntity, как вы видите.

К сожалению, (если я что-то упустил), единственный способ узнать, какой тип TEntity, - это если сначала создается закрытый метод с использованием MethodInfo.MakeGenericMethod, а затем выполняется, что, конечно, вряд ли будет сделано вашими вызывающими. .

См. Эту страницу MSDN для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...