如何在无法访问 Class 类型的情况下获取 class 成员
How to get class members without having access to Class type
我有一个 class (Plug_Comment),其属性作为另一个 class (m_Descriptor) 的成员传递
我也可以得到类型
在里面我可以看到 属性 我需要的(没用的),它是双倍的
但我无法获取它,因为类型 Plug_Comment 在这里未知,所以我无法转换它。
-----编辑----
我会试着再解释一遍。抱歉没说清楚。
我想访问 class 的成员。
class 类型是 Plug_Comment.Cplug_Comment 并且成员名称是双重无用的,这又在 class 属性中;
So namespace = Plug_Comment with inside class Plugin_Comment, inside the class Properties and inside the member double useless 这就是我想要的。
然后,我从代码的另一部分获得了上述属性,但将其转换为一个对象(见上文)。从那里看不到命名空间 Plug_Comment。所以我所拥有的只是对象,我无法将其转换为 Plug_Comment.PluginComment.Properties.
话虽这么说 visual studio 清楚地表明(见图)此对象的类型为 Plug_Comment.properties。
这就是我尝试使用反射的原因。反省不反省怎么弄到双无用?
试试这个:
foreach (var item in m_Descriptor.Properties.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
{
if (item.Name.Contains("useless"))
{
double myUseless = System.Convert.ToDouble (item.GetValue(m_Descriptor.Properties));
}
}
你迭代所有字段(在你的例子中是 1),当名称正确时你得到值
I have a class (Plug_Comment)
您没有 Plug_Comment class。根据您的屏幕截图, Plug_Comment 是一个命名空间。它包含两个 class; CPlug_Comment
class 和 properties
class。 properties
class 包含一个名为 useless
的 属性。
要访问一个名为 useless
的 属性,它属于一个名为 properties
的 class,它位于命名空间 Plug_Comment
中,您可以这样做所以(该示例包括创建 class properties
的实例):
using Plug_Comment;
var instanceOfProperties = new properties();
double uselessValue = instanceOfProperties.useless;
这是一个基于您问题中第一个屏幕截图的示例:
var a = m_Descriptor.Properties.useless;
Я также могу получить тип
由此我们可以得出结论,变量a
是Plug_Comment
命名空间中的properties
类型。
因此,变量可以转换为这种类型:
Plug_Comment.properties prps = (Plug_Comment.properties) a;
或:
using Plug_Comment;
properties prps = (properties) a;
进行此类转换后,您将可以使用“属性”类型的所有 public 成员。
可以获取和设置属性的值,调用方法。
double num = prps.useless;
prps.useless = 123.456;
如果“properties”类型为私有或内部,编译器可能会在此类转换中产生错误。
如果存在该错误,请显示其全文。
在这种情况下,您将不得不使用反射来处理非 public class.
我有一个 class (Plug_Comment),其属性作为另一个 class (m_Descriptor) 的成员传递
我也可以得到类型
在里面我可以看到 属性 我需要的(没用的),它是双倍的
但我无法获取它,因为类型 Plug_Comment 在这里未知,所以我无法转换它。
-----编辑----
我会试着再解释一遍。抱歉没说清楚。
我想访问 class 的成员。
class 类型是 Plug_Comment.Cplug_Comment 并且成员名称是双重无用的,这又在 class 属性中;
So namespace = Plug_Comment with inside class Plugin_Comment, inside the class Properties and inside the member double useless 这就是我想要的。
然后,我从代码的另一部分获得了上述属性,但将其转换为一个对象(见上文)。从那里看不到命名空间 Plug_Comment。所以我所拥有的只是对象,我无法将其转换为 Plug_Comment.PluginComment.Properties.
话虽这么说 visual studio 清楚地表明(见图)此对象的类型为 Plug_Comment.properties。
这就是我尝试使用反射的原因。反省不反省怎么弄到双无用?
试试这个:
foreach (var item in m_Descriptor.Properties.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
{
if (item.Name.Contains("useless"))
{
double myUseless = System.Convert.ToDouble (item.GetValue(m_Descriptor.Properties));
}
}
你迭代所有字段(在你的例子中是 1),当名称正确时你得到值
I have a class (Plug_Comment)
您没有 Plug_Comment class。根据您的屏幕截图, Plug_Comment 是一个命名空间。它包含两个 class; CPlug_Comment
class 和 properties
class。 properties
class 包含一个名为 useless
的 属性。
要访问一个名为 useless
的 属性,它属于一个名为 properties
的 class,它位于命名空间 Plug_Comment
中,您可以这样做所以(该示例包括创建 class properties
的实例):
using Plug_Comment;
var instanceOfProperties = new properties();
double uselessValue = instanceOfProperties.useless;
这是一个基于您问题中第一个屏幕截图的示例:
var a = m_Descriptor.Properties.useless;
Я также могу получить тип
由此我们可以得出结论,变量a
是Plug_Comment
命名空间中的properties
类型。
因此,变量可以转换为这种类型:
Plug_Comment.properties prps = (Plug_Comment.properties) a;
或:
using Plug_Comment;
properties prps = (properties) a;
进行此类转换后,您将可以使用“属性”类型的所有 public 成员。 可以获取和设置属性的值,调用方法。
double num = prps.useless;
prps.useless = 123.456;
如果“properties”类型为私有或内部,编译器可能会在此类转换中产生错误。 如果存在该错误,请显示其全文。 在这种情况下,您将不得不使用反射来处理非 public class.