正在从接口获取泛型的类型

本文关键字:泛型 类型 获取 接口 | 更新日期: 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