К сожалению, это невозможно. Вывод типа параметров generi c - это предложение "все или ничего". Либо все параметры могут быть выведены, и вы должны (явно) не указать ни одного, либо вы должны указать их все явно.
У вас есть выбор только между следующими вариантами:
public class UserSettings
{
// Variant A
public TSetting GetSetting<TSetting>(int ownerId)
where TSetting : ISetting
{
return default;
}
// Variant B
public TValue GetSettingValue<TSetting, TValue>(int ownerId)
where TSetting : Setting<TValue>
{
return default;
}
}
Что вы можете использовать вот так. Где x,y,z
должны быть неявно набраны как bool
.
class Demo
{
public void Run()
{
var us = new UserSettings();
// Variant A
var x = us.GetSetting<SubscribeToNewsletterSetting>(22).DefaultValue;
// Variant B
var y = us.GetSettingValue<SubscribeToNewsletterSetting, bool>(22);
// desired, but impossible
var z = us.GetSettingValue<SubscribeToNewsletterSetting>(22);
}
}
Я рекомендую добавить свойство public T Value {get;}
в Settings<T>
и добавить код доступа к базе данных (или по крайней мере, в части строгой типизации) на 'SubscribeToNewsletterSetting' (где известен тип TValue).