C#:反射:在中创建Get类对象
我正在研究如何获取在其中创建另一个对象的对象(或对象类型)。例如:C#:反射:在中创建Get类对象,c#,reflection,class,outer-join,C#,Reflection,Class,Outer Join,我正在研究如何获取在其中创建另一个对象的对象(或对象类型)。例如: public class RootClass { public class A { public void MethodFromA() { } } public class B { public A A_object = new A(); public void MethodFromB() { }
public class RootClass
{
public class A
{
public void MethodFromA()
{
}
}
public class B
{
public A A_object = new A();
public void MethodFromB() { }
}
B BObject = new B();
A rootAObject = new A();
public void DoMethod(A anA_object)
{
}
main()
{
/* Somehow through reflection
* get the instance of BObject
* of type B from only the info
* given in anA_object or at
* the very least just know that
* anA_object was created in
* class B and not root. */
DoMethod(BObject.A_object);
/* Same as above except know that
* this A object came from root
* and is not from B class */
DoMethod(rootAObject);
}
}
// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);
其他信息:
这只是一个模拟我拥有的一个大型项目的一部分的快速代码。问题是我有一个自定义类,它在许多其他类的许多地方实例化。这个自定义类有一个函数,它应该能够调用其中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。基本上我需要“.”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来查找objectA
谢谢 我相信您要查找的是您感兴趣的
System.Type
实例上定义的属性DeclaringType
。请参阅。我相信您要查找的是您感兴趣的System.Type
实例上定义的属性DeclaringType
。请参阅。否-此信息不会存储在任何位置。请注意,即使是这样,它也很容易变得过时。例如:
public class RootClass
{
public class A
{
public void MethodFromA()
{
}
}
public class B
{
public A A_object = new A();
public void MethodFromB() { }
}
B BObject = new B();
A rootAObject = new A();
public void DoMethod(A anA_object)
{
}
main()
{
/* Somehow through reflection
* get the instance of BObject
* of type B from only the info
* given in anA_object or at
* the very least just know that
* anA_object was created in
* class B and not root. */
DoMethod(BObject.A_object);
/* Same as above except know that
* this A object came from root
* and is not from B class */
DoMethod(rootAObject);
}
}
// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);
现在应该显示什么?bobObject的当前值。一个_对象
被创建为rootAObject
,但rootAObject
的当前值为空。如果你想让它显示为“所有者”,那么你根本就不是在谈论创造。。。在这一点上,您需要处理一个对象有多个引用的可能性
请给我们更多关于全局的信息:您真正想解决的问题是什么?否-此信息不会存储在任何地方。请注意,即使是这样,它也很容易变得过时。例如:
public class RootClass
{
public class A
{
public void MethodFromA()
{
}
}
public class B
{
public A A_object = new A();
public void MethodFromB() { }
}
B BObject = new B();
A rootAObject = new A();
public void DoMethod(A anA_object)
{
}
main()
{
/* Somehow through reflection
* get the instance of BObject
* of type B from only the info
* given in anA_object or at
* the very least just know that
* anA_object was created in
* class B and not root. */
DoMethod(BObject.A_object);
/* Same as above except know that
* this A object came from root
* and is not from B class */
DoMethod(rootAObject);
}
}
// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);
现在应该显示什么?bobObject的当前值。一个_对象
被创建为rootAObject
,但rootAObject
的当前值为空。如果你想让它显示为“所有者”,那么你根本就不是在谈论创造。。。在这一点上,您需要处理一个对象有多个引用的可能性
请给我们提供更多关于全局的信息:您真正想要解决的问题是什么?DeclaringType将只告诉您代码模型的封闭类型,但您需要的是识别对象创建点
除了阅读单独的MethodBody IL之外,没有简单的方法可以做到这一点。用于创建对象的IL代码是newobj。要实现这一点,您需要读取程序集中每个方法的MethodBody,并识别包含newobj指令的方法,其类型操作数为您所追求的对象类型。DeclaringType将只告诉您代码模型的封闭类型,但您所追求的是识别对象创建点
除了阅读单独的MethodBody IL之外,没有简单的方法可以做到这一点。用于创建对象的IL代码是newobj。为此,,您将需要读取程序集中每个方法的MethodBody,并识别包含newobj指令的方法,该指令的类型操作数为您所追求的对象类型。通过使所有我的对象从具有父参数的自定义对象派生来解决。通过使所有我的对象从具有父参数的自定义对象派生来解决父参数。这看起来您已经得到了您认为是解决方案的一部分,并且正在请求帮助解决不可能的部分。您试图解决的实际问题是什么?如果可能的话,它将不是通过反射,而是像堆栈跟踪一样的运行时诊断。反射只是为了反射类元数据,而不是实例。此外,虽然我同意@Anon的观点,但这个问题本身就很有趣。这只是一个模拟我拥有的大型项目的一部分的快速代码。问题是我有一个自定义类,它在许多其他类的许多地方实例化。这个自定义类有一个函数,它应该能够调用其中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。我需要“.”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来查找objectA。这看起来您已经得到了您认为是解决方案的一部分,并且正在就不可能的部分寻求帮助。您试图解决的实际问题是什么?如果可能的话,它将不是通过反射,而是像堆栈跟踪一样的运行时诊断。反射只是为了反射类元数据,而不是实例。此外,虽然我同意@Anon的观点,但这个问题本身就很有趣。这只是一个模拟我拥有的大型项目的一部分的快速代码。问题是我有一个自定义类,它在许多其他类的许多地方实例化。这个自定义类有一个函数,它应该能够调用其中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。我需要“.”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来查找objectA。不,我认为这与这里的问题无关。所讨论的两个对象具有相同的类型。。。但是这些实例是由不同类型的调用创建的。不,我不认为这与这里的问题有任何关系。所讨论的两个对象具有相同的类型。。。但实例是由不同类型的调用创建的。