«Принудительное» соответствие общему ограничению - PullRequest
3 голосов
/ 28 января 2012

У меня есть класс, Target<T>, который нельзя изменить, с общим ограничением. Я хочу построить экземпляры этого класса из общего класса, который не имеет ограничений. Следующее демонстрирует намерение того, что я хочу сделать, но я понимаю, что этот код не будет компилироваться и что typeof(T).IsClass - это проверка во время выполнения, а общие ограничения - это проблемы во время компиляции.

public class TargetMaker<T>
{
    public object GetTarget()
    {
        if (typeof(T).IsClass)
        {
            return new Target<T>();
        }
        return default(T);
    }
}

public class Target<T> where T : class
{
    public Target() { }
}

Может кто-нибудь придумать, как я могу достичь того, чего я хочу, здесь, в TargetMaker, без добавления к нему соответствующего ограничения, сохраняя при этом всю логику в классе TargetMaker?

1 Ответ

5 голосов
/ 28 января 2012

Вы не против использовать отражение?Если нет:

if (typeof(T).IsClass)
{
    Type targetType = typeof(Target<>).MakeGenericType(typeof(T));
    return Activator.CreateInstance(targetType);
}
...

Если производительность является проблемой, возможно, есть способы ее оптимизации - например, создание делегатов фабрики с помощью деревьев выражений и их кэширование.Это будет много хлопот, если производительность не проблема, хотя:)

...