如今,我正在探索C#Expression API。 因此,我可以借助一些帮助来了解其工作原理,包括表达与反思之间的区别。 我还想了解表达式是否仅是语法糖,还是确实比反射性能更好?
好的例子以及到好的文章的链接将不胜感激。 :-)
我有两节课。
public class A {
public Object method() {...}
}
public class B extends A {
@Override
public Object method() {...}
}
我有一个B的实例。如何从b调用A.method()? 基本上,效果与从B调用super.method()相同。
B b = new B();
Class<?> superclass = b.getClass().getSuperclass();
Method method = superclass.getMethod("method", ArrayUtils.EMPTY_CLASS_ARRAY);
Object value = method.invoke(obj, ArrayUtils.EMPTY_OBJECT_ARRAY);
但是上面的代码仍然会调用B.method()
如何在运行时获取CLASSPATH
中所有可用类的列表?
在Eclipse IDE中,您可以通过按Ctrl + Shift + T来执行此操作。
Java中是否有任何方法可以完成它?
我有以下代码:
PropertyInfo[] originalProperties = myType.GetProperties();
我想从propInfo.Name == "Item"
中排除所有索引器(myVar [“ key”]作为名为“ Item”的属性出现)。
正确的方法是什么?
排除所有不能选择propInfo.Name == "Item"
的属性。
它们的用法如下:
FieldInfo field = fieldof(string.Empty);
MethodInfo method1 = methodof(int.ToString);
MethodInfo method2 = methodof(int.ToString(IFormatProvider));
fieldof
可以编译为IL,如下所示:
ldtoken <field>
call FieldInfo.GetFieldFromHandle
typeof
可以编译为IL:
ldtoken <method>
call MethodBase.GetMethodFromHandle
每当使用typeof
运算符时,您都会得到理想的“查找所有参考”结果。 不幸的是,一旦您进入字段或方法,您最终会受到讨厌的攻击。 我认为您可以执行以下操作...,也可以返回按名称获取字段。
public static FieldInfo fieldof<T>(Expression<Func<T>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return (FieldInfo)body.Member;
}
public static MethodInfo methodof<T>(Expression<Func<T>> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
public static MethodInfo methodof(Expression<Action> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
public static void Test()
{
FieldInfo field = fieldof(() => string.Empty);
MethodInfo method1 = methodof(() => default(string).ToString());
MethodInfo method2 = methodof(() => default(string).ToString(default(IFormatProvider)));
MethodInfo method3 = methodof(() => default(List<int>).Add(default(int)));
}
我有以下代码循环遍历一个对象并通过反射获取其所有属性:
foreach (var propertyInfo in typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
var oldValue = propertyInfo.GetValue(oldVersion, null);
}
如何检查仅查看带有“设置”的属性? (我想忽略只读值-只是“获取”。)
动态加载Java类文件的一种好方法是什么,以便编译到jar中的程序可以读取目录中的所有类文件并使用它们,以及如何编写这些文件以使它们具有必要的包名称 罐子里
我想要公开WebClient.DownloadDataInternal方法,如下所示:
[ComVisible(true)]
public class MyWebClient : WebClient
{
private MethodInfo _DownloadDataInternal;
public MyWebClient()
{
_DownloadDataInternal = typeof(WebClient).GetMethod("DownloadDataInternal", BindingFlags.NonPublic | BindingFlags.Instance);
}
public byte[] DownloadDataInternal(Uri address, out WebRequest request)
{
_DownloadDataInternal.Invoke(this, new object[] { address, out request });
}
}
WebClient.DownloadDataInternal有一个out参数,我不知道如何调用它。救命!
我正在寻找一种使用仅在运行时已知的属性名称来修改ExpandoObject
C#4.0对象上的属性的方法。
有没有办法做类似的事情(仅以ExpandoObject
为例,这可以是实现IDynamicMetaObjectProvider
的任何类):
string key = "TestKey";
dynamic e = new ExpandoObject();
e[key] = "value";
相当于:
dynamic e = new ExpandoObject();
e.TestKey = "value";
还是向前反思的唯一途径?
我有2个班级:a_field
和Child
public class Father implements Serializable, JSONInterface {
private String a_field;
//setter and getter here
}
public class Child extends Father {
//empty class
}
通过反射,我想在Child
类中设置a_field
:
Class<?> clazz = Class.forName("Child");
Object cc = clazz.newInstance();
Field f1 = cc.getClass().getField("a_field");
f1.set(cc, "reflecting on life");
String str1 = (String) f1.get(cc.getClass());
System.out.println("field: " + str1);
但我有一个例外:
线程“主”中的异常java.lang.NoSuchFieldException:a_field
但是,如果我尝试:
Child child = new Child();
child.setA_field("123");
有用。
使用setter方法,我有同样的问题:
method = cc.getClass().getMethod("setA_field");
method.invoke(cc, new Object[] { "aaaaaaaaaaaaaa" });
如何获得实现特定开放通用类型的所有类型?
例如:
public interface IUserRepository : IRepository<User>
查找实现IRepository<>
的所有类型。
public static IEnumerable<Type> GetAllTypesImplementingOpenGenericType(Type openGenericType, Assembly assembly)
{
...
}
我在String中有一段Java代码。
String javaCode = "if(polishScreenHeight >= 200 && " +
"polishScreenHeight <= 235 && polishScreenWidth >= 220) { }";
是否可以将此Java String转换为Java语句并运行它? 可能使用Java反射?
考虑这个例子:
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
C c = new C();
try {
Field f = C.class.getDeclaredField("a");
f.setAccessible(true);
Integer i = (Integer)f.get(c);
System.out.println(i);
} catch (Exception e) {}
}
}
class C {
private Integer a =6;
}
允许您通过反射来访问类的私有字段似乎是不合逻辑的。 为什么有这样的功能? 允许这样的访问不是“危险”吗?
在对象的构造函数中时,如何设置Exception
对象的Exception
属性? 这归结为查找和设置没有设置器的属性的后备字段。
顺便说一句:我已经看到了这个evain.net-使用Reflection使字段支持属性,但是如果可能的话,寻找非基于IL的解决方案。
Exception
的构造函数是创建Exception
类型的地方,因此我不能使用基类构造函数MyException() :base(...)
等来调用它。
假设您有一个文本文件,例如:
my_setting = ON
some_method = METHOD_A
verbosity = DEBUG
...
您希望相应地更新相应的对象:
Setting my_setting = ON;
Method some_method = METHOD_A;
Verbosity verbosity = DEBUG;
...
凡是不同种类的枚举。
我想有一个通用的方法来实例化枚举值。 也就是说,在运行时使用反射,而无需事先知道对象的枚举类型。
我会想到这样的事情:
for (ConfigLine line : lines)
{
String[] tokens = line.string.split("=", 2);
String name = tokens[0].trim();
String value = tokens[1].trim();
try
{
Field field = this.getClass().getDeclaredField(name);
if(field.getType().isEnum())
{
// doesn't work (cannot convert String to enum)
field.set(this, value);
// invalid code (some strange generics issue)
field.set(this, Enum.valueOf(field.getType().getClass(), value));
}
else
{ /*...*/ }
}
catch //...
}
问题是:应该有什么呢? 给定其String表示形式,甚至可以实例化未知枚举吗?
Rust具有TypeId
的特征,但是它也具有“不为不使用的产品付款”政策。 Rust如何实现反射?
我的猜测是Rust使用了惰性标记。 最初未分配每种类型,但是如果以后将该类型的实例传递给期望具有TypeId
特征的函数,则会为该类型分配TypeId
。
或者,Rust在其实例可能传递给该函数的每种类型上都添加了TypeId
? 我猜前者会很昂贵。
Assembly.GetEntryAssembly()不适用于Web应用程序。
但是...我真的需要像这样的东西。我使用了一些在Web和非Web应用程序中都使用过的嵌套代码。
我当前的解决方案是浏览StackTrace以找到第一个被调用的程序集。
/// <summary>
/// Version of 'GetEntryAssembly' that works with web applications
/// </summary>
/// <returns>The entry assembly, or the first called assembly in a web application</returns>
public static Assembly GetEntyAssembly()
{
// get the entry assembly
var result = Assembly.GetEntryAssembly();
// if none (ex: web application)
if (result == null)
{
// current method
MethodBase methodCurrent = null;
// number of frames to skip
int framestoSkip = 1;
// loop until we cannot got further in the stacktrace
do
{
// get the stack frame, skipping the given number of frames
StackFrame stackFrame = new StackFrame(framestoSkip);
// get the method
methodCurrent = stackFrame.GetMethod();
// if found
if ((methodCurrent != null)
// and if that method is not excluded from the stack trace
&& (methodCurrent.GetAttribute<ExcludeFromStackTraceAttribute>(false) == null))
{
// get its type
var typeCurrent = methodCurrent.DeclaringType;
// if valid
if (typeCurrent != typeof (RuntimeMethodHandle))
{
// get its assembly
var assembly = typeCurrent.Assembly;
// if valid
if (!assembly.GlobalAssemblyCache
&& !assembly.IsDynamic
&& (assembly.GetAttribute<System.CodeDom.Compiler.GeneratedCodeAttribute>() == null))
{
// then we found a valid assembly, get it as a candidate
result = assembly;
}
}
}
// increase number of frames to skip
framestoSkip++;
} // while we have a working method
while (methodCurrent != null);
}
return result;
}
为了确保组装符合我们的要求,我们有3个条件:
我遇到的最后一个问题是在单独的程序集中定义基本页面时。(我使用ASP.Net MVC,但与ASP.Net相同)。在这种情况下,返回的是单独的程序集,而不是包含页面的程序集。
我现在正在寻找的是:
1)我的装配验证条件是否足够? (我可能已经忘记了情况)
2)有没有一种方法可以从ASP.Net临时文件夹中给定的代码生成程序集获取有关包含该Page / View的项目的信息?(我认为不是,但是谁知道...)
使用反射获取MethodInfo,我想测试返回的类型是否为typeof System.Void。
测试是否是System.Int32正常
myMethodInfo.ReturnType == typeof(System.Int32)
但
myMethodInfo.ReturnType == typeof(System.Void)
不编译? 目前,我正在测试名称的字符串表示形式是否为“ System.Void”,这似乎非常错误。
在Scala 2.10中,如何稍后通过字符串(可能使用Toolbox api)从字符串生成一个类,以使用Scala的反射进行实例化?
我有一个自定义属性,我想将其应用于基本抽象类,以便在以HTML显示项目时可以跳过用户不需要查看的元素。 似乎覆盖基类的属性没有继承属性。
覆盖基本属性(抽象或虚拟)是否会破坏放置在原始属性上的属性?
从属性类定义
[AttributeUsage(AttributeTargets.Property,
Inherited = true,
AllowMultiple = false)]
public class NoHtmlOutput : Attribute
{
}
从抽象类定义
[NoHtmlOutput]
public abstract Guid UniqueID { get; set; }
从具体的类定义
public override Guid UniqueID{ get{ return MasterId;} set{MasterId = value;}}
从类检查属性
Type t = o.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (pi.GetCustomAttributes(typeof(NoHtmlOutput), true).Length == 1)
continue;
// processing logic goes here
}