C# 动态对象上的PropertyInfo是系统。对象不是所需的

C# 动态对象上的PropertyInfo是系统。对象不是所需的,c#,dynamic,propertyinfo,C#,Dynamic,Propertyinfo,我在运行时创建一个动态类型(请参见此处的说明:),并使用该类型在另一个类中创建一个动态成员 public class SomeClass { private dynamic _AnimalType = CreateAnimal<Animal>("Dog"); public dynamic AnimalType { get { return _AnimalType; } } static internal Propert

我在运行时创建一个动态类型(请参见此处的说明:),并使用该类型在另一个类中创建一个动态成员

    public class SomeClass
    {
        private dynamic _AnimalType = CreateAnimal<Animal>("Dog");
        public dynamic AnimalType { get { return _AnimalType; } }

        static internal PropertyInfo[] Sprops = typeof(SomeClass).GetProperties();
        static public PropertyInfo[] getPropertyInfos() { get { return Sprops; } }
    }

Sprops包含一个PropertyInfo(
System.Object
),它是“exptected”,但不是“想要的”。我想获取AnimalType当前的类型(
Animal
,或者更具体地说,
Dog
)。有没有办法做到这一点?我不想创建这个类的实例,然后调用一些“SetInternalProperties”方法。我们的想法是让属性作为静态属性随时可用。

是的,
PropertyInfo
无法获取字段的运行时类型。它所做的只是获取所声明的属性的类型

所以它应该是动态的,不是吗?你为什么要这么做
系统对象

好吧,动态只是
系统。对象
在用。这就是为什么您只看到
System.Object
。无法获取运行时信息(没有实例)

有没有办法做到这一点如果你能解释你想要达到的目标,你可能会得到更好的答案

如果您有
SomeClass
的实例,您可以找到什么是运行时类型

SomeClass instance = new SomeClass();// get instance somehow
PropertyInfo pi = ...;//Get the property info
Type dynamicType = pi.GetValue(instance).GetType();

我有一个系统,对象属性,这是什么意思?您从哪里获得
System.Object
?请澄清。上面已澄清:Sprops包含一个PropertyInfo('System.Object')是的,完全理解您所说的,并且我确切地知道为什么我得到的是System.Object而不是我想要的类型。也许我真的需要用另一种方式来解决这个问题。我澄清了一点。希望它能帮助解释我想做什么。@Tizz我更新了我的答案,展示了如何从
SomeClass
的实例中获取这些信息。没有实例,您就找不到它,原因很明显(因为您可以在运行时将任何内容存储在单独的实例中)。谢谢,这很有帮助。当前的代码使用PropertyInfo[]来做很多事情,我正在尝试将我的解决方案融入其中。我喜欢我可以得到动态类型,但我真的需要那种类型的PropertyInfo。您能继续提供进一步帮助吗?
PropertyInfo
是一个抽象类,没有任何公共实现。所以您不能自己创建实例。获取类型不存在的
PropertyInfo
实例非常困难。如果您的代码与
PropertyInfo
非常耦合,则需要将其解耦。可能是一个接口,或者属性名为
PropertyType
MyCustomPropertyInfo
类可以提供帮助。这样,您就可以从实现中返回动态属性。我希望这有帮助。我知道没有答案,只是想用另一种方式来看待它,你确实帮了我。我最终改变了“实现的代码”来处理动态案例。正如上面所示,使用
PropertyType
是实现这一点的关键。谢谢
SomeClass instance = new SomeClass();// get instance somehow
PropertyInfo pi = ...;//Get the property info
Type dynamicType = pi.GetValue(instance).GetType();