В методе WhatGenericTypeIAm Я хочу получить информацию о реализации, а не абстракцию родового, так что я мог видеть «Person» not «AbstractModel» Есть ли способ сделать это или это невозможно, нужно перепроектировать?Получение типа из интерфейса
public class Program
{
private static void Main(string[] args)
{
var container = new ContainerBuilder();
container.RegisterType<SomeA>();
container.RegisterType<MyDependency>().As<IMyDependency<Person>>(); // generic T is a Person
var buildedContainer = container.Build();
var someBase = buildedContainer.Resolve<SomeA>();
someBase.SayName();
Console.ReadKey();
}
}
public interface IMyDependency<in T>
{
void WhatGenericTypeIAm();
}
public class MyDependency : IMyDependency<AbstractModel>
{
private string objectName = typeof (AbstractModel).Name;
public void WhatGenericTypeIAm()
{
Console.WriteLine("My generic type is " + objectName); // it shows "AbstractModel" but i want to see "Person"
}
}
public abstract class AbstractModel // will be implemented not only by Person
{
}
public class Person : AbstractModel
{
}
public abstract class SomeBaseClass<T>
where T : AbstractModel
{
private readonly IMyDependency<Person> _myDependency;
public SomeBaseClass(IMyDependency<Person> myDependency) // generic T is Person
{
_myDependency = myDependency;
}
public void SayName()
{
_myDependency.WhatGenericTypeIAm();
}
}
public class SomeA : SomeBaseClass<Person>
{
public SomeA(IMyDependency<Person> myDependency) : base(myDependency)
{
}
}
@BrentWorden хмм я действительно не понимаю, теперь у меня есть это, и это та же самая проблема
namespace ConsoleApplication1
{
public class Program
{
private static void Main(string[] args)
{
var container = new ContainerBuilder();
container.RegisterType<SomeA>();
container.RegisterType<SomeB>();
container.RegisterType<MyDependency<AbstractModel>>().As<IMyDependency>(); // generic T is a Person
var buildedContainer = container.Build();
var someBase = buildedContainer.Resolve<SomeA>();
someBase.SayName();
Console.ReadKey();
}
}
public interface IMyDependency
{
void WhatGenericTypeIAm();
}
public class MyDependency<T> : IMyDependency
{
private string objectName = typeof (T).Name;
public void WhatGenericTypeIAm()
{
Console.WriteLine("My generic type is " + objectName); // it shows "AbstractModel" but i want to see "Person"
}
}
public abstract class AbstractModel // will be implemented not only by Person
{
}
public class Person : AbstractModel
{
}
public class OtherPerson : AbstractModel
{
}
public abstract class SomeBaseClass<T>
where T : AbstractModel
{
private readonly IMyDependency _myDependency;
public SomeBaseClass(IMyDependency myDependency) // generic T is Person or OtherPerson
{
_myDependency = myDependency;
}
public void SayName()
{
Console.WriteLine("My name is " + typeof(T)); // i want this in _myDependency
_myDependency.WhatGenericTypeIAm();
}
}
public class SomeA : SomeBaseClass<Person>
{
public SomeA(IMyDependency myDependency) : base(myDependency) //myDependency T is Person
{
}
}
public class SomeB : SomeBaseClass<OtherPerson>
{
public SomeB(IMyDependency myDependency) : base(myDependency) //myDependency T is OtherPerson
{
}
}
}
Есть ли причина, по которой 'T' вообще не используется в' SomeBaseClass'? –
@WiktorZychla no, его можно использовать – UnderNotic
Изменить MyDependency на MyDependency с регистрацией Unitiy. –