我有一个特别的需要,我似乎无法弄明白。我已经对此做了一些研究,但找不到可行的解决方案。
我有一个基类:
public abstract class BaseProvider<T> {}
这个类又由两个不同的提供者类继承:
public sealed class MonkeyProvider<T>
: BaseProvider<MonkeyProvider<T>>
where T
: IAnimalProvider
在接口IAnimalProvider中,我公开了一个所有实现必须派生的属性。现在,MonkeyProvider和DonkeyProvider或类似的东西需要知道根实例的属性的赋值是什么:
public class JoburgZoo
: IAnimalProvider
{
#region IAnimalProvider members
public string Id{ get; set; }
#endregion
}
// somewhere in a console application
public static void Main(string[] args)
{
JoburgZoo zoo = new JoburgZoo();
zoo.Id = "Mammals";
**// edit: an instance of the provider will be created**
MonkeyProvider<JoburgZoo> mp = new MonkeyProvider<JoburgZoo>();
mp.CheckMonkeys(zoo); // where CheckMonkeys(JoburgZoo) is a method in the provider
}
现在,这是我的实际问题:
我需要通过BaseProvider公开一个内部属性,每个实现它的实例都可以访问它。此属性需要在任何给定点返回“Id”的值,但我似乎无法通过反射获取值(我知道这是解决方案)。
从我的各种徒劳无功的努力:
Type type = typeof(T); // this returns BaseProvider<MonkeyProvider<T>>
var generic = type.GetGenericTypeDefinition(); // brings back BaseProvider<T>
我无法创建T的新实例,因为它将清除当前分配给该对象的所有值。我无法迭代属性信息集合,因为它只返回BaseProvider的属性。
感谢您提供任何帮助。 埃里克
//编辑。
在上面的控制台主代码中添加了一个额外的调用。 MonkeyProvider<T>
模板JoburgZoo的实例,所以在ProviderBase<T>
中它看起来像:
ProviderBase<MonkeyProvider<JoburgZoo>>
我想知道JoburgZoo的属性是什么,来自BaseProvider<T>
,而无需使用MonkeyProvider<T>
来识别对象。
希望这是有道理的。
答案 0 :(得分:2)
使用以下类定义
class BaseProvider<T>
{
//...
}
以下代码返回System.Int32
:
Type type = typeof(BaseProvider<Int32>);
foreach (var arg in type.GetGenericArguments())
{
MessageBox.Show(arg.FullName);
}