正在从接口获取泛型的类型
本文关键字:泛型 类型 获取 接口 | 更新日期: 2023-09-27 18:02:31
在方法WhatGenericTypeIAm中,我想获得有关实现的信息,而不是泛型的抽象,所以我可以看到"Person"而不是"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
{
}
}
}
MyDependency类必须声明为泛型类。然后你可以使用泛型的类型来做你想做的事情:
public class MyDependency<T> : IMyDependency<T>
{
private string objectName = typeof(T).Name;
public void WhatGenericTypeIAm()
{
Console.WriteLine("My generic type is " + objectName);
}
}
按照现在的方式,MyDependency是使用AbstractModel静态类型化的。
类型MyDependency
没有Person
的概念,即使您正在运行它。
如果MyDependency
的任何方法碰巧实际使用了Person
对象,那么您将能够从中获得名称"Person"
,但在您实际使用Person
对象之前,您试图打印的数据根本不存在。
所以,即使你写
IMyDependency<Person> dependency = new MyDependency();
您的对象是new MyDependency()
,而IMyDependency<Person>
只是您放入的变量的一个属性。实际对象本身没有Person
的概念,也不需要有。它所关心的是,它所处理的任何对象都是AbstractModel