Tag: reflection

如何获得基于名称的属性值

有没有办法根据其名称获取对象属性的值? 例如,如果我有: public class Car : Vehicle { public string Make { get; set; } } 和 var car = new Car { Make="Ford" }; 我想写一个方法,我可以传入属性名称,它会返回属性值。 即: public string GetPropertyValue(string propertyName) { return the value of the property; }

私人方法真的很安全吗?

在Java中, private访问修饰符被认为是安全的,因为它在类之外是不可见的。 那么外界也不知道这个方法。 但是我认为Javareflection可以用来打破这个规则。 考虑以下情况: public class ProtectedPrivacy{ private String getInfo(){ return "confidential"; } } 现在从另外一个class级我将获得信息: public class BreakPrivacy{ public static void main(String[] args) throws Exception { ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy(); Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null); method.setAccessible(true); Object result = method.invoke(protectedPrivacy); System.out.println(result.toString()); } } 此时我只想到还有一些私人的方法,因为做了一些像上面这样的事情我们必须知道方法的名字。 但是如果包含其他人编写的私有方法的类我们没有这些可见性。 但是由于下面的代码,我的观点变得无效了。 Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods(); 现在这个method[]包含了所有需要做的事情。 我的问题是,有没有办法避免使用Javareflection这种事情? […]

我可以使用reflection更改C#中的私有只读字段吗?

我想知道,因为很多事情可以使用reflection来完成,我可以在构造函数完成执行后更改私有只读字段吗? (注意:只是好奇) public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } } Foo foo = new Foo(123); Console.WriteLine(foo.GetBar()); // display 123 // reflection code here… Console.WriteLine(foo.GetBar()); // display 456

通过reflection调用getter的最佳方式

我需要获得具有特定注释的字段的值,所以通过reflection,我可以得到这个字段对象。 问题是,这个领域将永远是私人的,虽然我事先知道它总是有一个getter方法。 我知道我可以使用setAccesible(true)并获取它的值(当没有PermissionManager时),但我更喜欢调用它的getter方法。 我知道我可以通过查找“get + fieldName”来寻找方法(虽然我知道例如布尔字段有时被命名为“is + fieldName”)。 我想知道是否有更好的方法来调用这个getter(许多框架使用getters / setter来访问属性,所以也许他们以另一种方式)。 谢谢

是否可以通过反思来设置私有财产?

我可以通过反思设置私人财产吗? public abstract class Entity { private int _id; private DateTime? _createdOn; public virtual T Id { get { return _id; } private set { ChangePropertyAndNotify(ref _id, value, x => Id); } } public virtual DateTime? CreatedOn { get { return _createdOn; } private set { ChangePropertyAndNotify(ref _createdOn, value, x => CreatedOn); } } } […]

从未知对象获取属性和值

从PHP的世界中,我决定给C#一个去。 我有一个search,但似乎无法find如何做到这一点的答案。 $object = new Object(); $vars = get_class_vars(get_class($object)); foreach($vars as $var) { doSomething($object->$var); } 我基本上有一个对象的列表。 该对象可以是三种不同types之一,并将具有一组公共属性。 我想能够获得对象的属性列表,循环它们,然后将它们写出到一个文件。 我认为这与c#reflection有关,但这对我来说是全新的。 任何帮助将不胜感激。

BindingFlags.IgnoreCase不适用于Type.GetProperty()?

想象下面 T型有一个公司。 当执行下面的方法时,它完美的工作: Type t = typeof(T); t.GetProperty("Company") 下面的电话,但我得到空 Type t = typeof(T); t.GetProperty("company", BindingFlags.IgnoreCase) 有人有个想法吗?

如何dynamic加载一个Python类

给定一个Python类的string,例如my_package.my_module.MyClass ,加载它的最佳方法是什么? 换句话说,我正在寻找一个相当于Java的Class.forName() ,在Python中的function。 它需要在Google App Engine上工作。 最好这是一个函数,接受类的FQN作为一个string,并返回一个类的引用: my_class = load_class('my_package.my_module.MyClass') my_instance = my_class()

如何可靠地确定在devise时使用var声明的variables的types?

我正在为emacs中的C#完成(intellisense)工具。 这个想法是,如果用户键入一个片段,然后通过特定的按键组合来请求完成,完成工具将使用.NETreflection来确定可能的完成。 这样做需要知道正在完成的事物的types。 如果它是一个string,则有一组已知的可能的方法和属性; 如果它是一个Int32,它有一个单独的集合,依此类推。 使用语义,emacs中可用的代码词法分析器/parsing器包,我可以findvariables声明及其types。 鉴于此,使用reflection来获取types的方法和属性是很简单的,然后向用户提供选项列表。 (好吧, 在 emacs 里面做的不是很简单 ,但是使用在 emacs 里面运行powershell的过程变得容易多了,我写了一个自定义的.NET程序集来做reflection,把它加载到powershell中,然后在内部运行elisp emacs可以通过comint向powershell发送命令并读取响应,因此emacs可以快速得到reflection结果。) 当代码在正在完成的事情的声明中使用var时,问题就到了。 这意味着types没有明确指定,完成将不起作用。 如何用var关键字声明variables时,如何可靠地确定实际使用的types? 只是要清楚,我不需要在运行时确定它。 我想在“devise时间”确定它。 到目前为止,我有这些想法: 编译和调用: 提取声明语句,例如`var foo =“一个string值”;` 连接一个语句`foo.GetType();` 将生成的C#片段dynamic编译成一个新的程序集 将程序集加载到一个新的AppDomain中,运行framgment并获取返回types。 卸载并丢弃程序集 我知道如何做到这一切。 但是,对于编辑器中的每个完成请求,它听起来都非常重量级。 我想我每次都不需要一个新的AppDomain。 我可以重复使用一个AppDomain来处理多个临时程序集,并在多个完成请求中分摊设置和分解的成本。 这更多的是对基本想法的调整。 编译和检查IL 简单地将声明编译成模块,然后检查IL,以确定编译器推断的实际types。 这怎么可能? 我会用什么来检查IL? 有更好的想法吗? 注释? build议? 编辑 – 进一步思考,编译和调用是不可接受的,因为调用可能有副作用。 所以必须排除第一个选项。 另外,我想我不能假定.NET 4.0的存在。 更新 – 上面没有提到的正确答案,但Eric Lippert轻声指出,是实现一个完全保真types推断系统。 它是在devise时可靠地确定variablestypes的唯一方法。 但是,这也不容易。 因为我不想有任何幻想想要尝试构build这样的事情,所以我select了选项2的快捷方式 – […]

在运行时,查找扩展基类的Java应用程序中的所有类

我想要做这样的事情: List<Animal> animals = new ArrayList<Animal>(); for( Class c: list_of_all_classes_available_to_my_app() ) if (c is Animal) animals.add( new c() ); 所以,我想看看我的应用程序的所有的类,当我find一个从动物下降,我想创build一个新types的对象,并将其添加到列表中。 这使我可以添加function,而不必更新的东西列表。 我可以避免以下情况: List<Animal> animals = new ArrayList<Animal>(); animals.add( new Dog() ); animals.add( new Cat() ); animals.add( new Donkey() ); … 通过上面的方法,我可以简单地创build一个扩展Animal的新类,它会自动拾取。 更新date:2008年10月16日上午9:00太平洋标准时间: 这个问题产生了很多很好的答案 – 谢谢。 从答复和我的研究中,我发现我真正想要做的事情在Java下是不可能的。 有一些方法,比如ddimitrov的ServiceLoader机制可以工作 – 但是对于我想要的,它们非常沉重,我相信我只是将问题从Java代码移动到外部configuration文件。 另一种expression我想要的方式:我的Animal类中的静态函数查找并实例化所有inheritance自Animal的类 – 不需要任何进一步的configuration/编码。 如果我必须configuration,不妨将它们在Animal类中实例化。 我明白,因为一个Java程序只是一个松散的.class文件联合,就是这样。 有趣的是,在C#中这似乎相当微不足道 […]