C # не может выразить тип "self", но вы можете эмулировать его с любопытным повторяющимся шаблоном (CRTP).
public class Base<TSelf> where TSelf : Base<TSelf>
{
// Make this a property if you want.
public IRepository<TSelf> GetTable()
{
return _container.Resolve<IRepository<TSelf>>();
}
}
public class Derived : Base<Derived> { }
Использование:
IRepository<Derived> table = new Derived().GetTable();
Это не глупо. Для получения более подробной информации, прочитайте это сообщение в блоге Эрика Липперта: Curiouser и curiouser .
С другой стороны, если вам нужно, чтобы аргумент типа для вызова _container.Resolve
основывался только на текущем типе, но мог возвращать более общий тип из метода, вам не нужно прибегать к этому шаблон. Вместо этого вы можете использовать отражение:
// If the container's Resolve method had an overload that
// accepted a System.Type, it would be even easier.
public SomeBaseType GetTable()
{
var repositoryType = typeof(IRepository<>).MakeGenericType(GetType());
var result = _container.GetType()
.GetMethod("Resolve")
.MakeGenericMethod(repositoryType)
.Invoke(_container, null);
return (SomeBaseType) result;
}