相关疑难解决方法(0)

为什么C#中没有`fieldof`或`methodof`运算符?

它们可以如下使用:

FieldInfo field = fieldof(string.Empty);
MethodInfo method1 = methodof(int.ToString);
MethodInfo method2 = methodof(int.ToString(IFormatProvider));
Run Code Online (Sandbox Code Playgroud)

fieldof 可以编译为IL为:

ldtoken <field>
call FieldInfo.GetFieldFromHandle
Run Code Online (Sandbox Code Playgroud)

methodof 可以编译为IL为:

ldtoken <method>
call MethodBase.GetMethodFromHandle
Run Code Online (Sandbox Code Playgroud)

无论何时使用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 …
Run Code Online (Sandbox Code Playgroud)

c# reflection

43
推荐指数
3
解决办法
6629
查看次数

选择具有反射的右通用方法

我想通过反射选择正确的通用方法,然后调用它.

通常这很容易.例如

var method = typeof(MyType).GetMethod("TheMethod");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
Run Code Online (Sandbox Code Playgroud)

但是,当方法存在不同的泛型重载时,问题就开始了.例如,System.Linq.Queryable类中的静态方法.'Where'方法有两种定义

static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T,bool>> predicate)
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T,int,bool>> predicate)
Run Code Online (Sandbox Code Playgroud)

这说明GetMethod无法正常工作,因为它无法让两者黯然失色.因此,我想选择正确的.

到目前为止,我经常只采取第一种或第二种方法,这取决于我的需要.像这样:

var method = typeof (Queryable).GetMethods().First(m => m.Name == "Where");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
Run Code Online (Sandbox Code Playgroud)

但是我对此并不满意,因为我做了一个很大的假设,即第一种方法是正确的.我宁愿通过参数类型找到正确的方法.但我无法弄清楚如何.

我尝试传递'类型',但它没有用.

        var method = typeof (Queryable).GetMethod(
            "Where", BindingFlags.Static,
            null,
            new Type[] {typeof (IQueryable<T>), typeof (Expression<Func<T, bool>>)},
            null);
Run Code Online (Sandbox Code Playgroud)

所以有人知道如何通过反射找到'正确'的通用方法.例如,Queryable类的'Where'方法的正确版本?

c# reflection

34
推荐指数
4
解决办法
1万
查看次数

Lambda表达式未返回预期的MemberInfo

我遇到了一个我没想到的问题.一个例子可能比一段更好地说明我的问题:

更新:跳转到最后一个代码块,以获得更有说服力的代码示例.

public class A
{
  public string B { get; set; }
}

public class C : A { }
Run Code Online (Sandbox Code Playgroud)

以下是方法中的一些代码:

var a = typeof(C).GetMember("B")[0];
var b = typeof(A).GetMember("B")[0];

Expression<Func<C, string>> c = x => x.B;

var d = (c.Body as MemberExpression).Member;
Run Code Online (Sandbox Code Playgroud)

以下是一些比较的结果:

a == b //false
a == d //false
b == d //true
Run Code Online (Sandbox Code Playgroud)

前两个有些出乎意料.我知道即使B不是虚拟的,C也可以用w new运算符定义一个具有相同名称的属性,但在这种情况下我没有.

第二个对我来说真是最让人惊讶的(也是我问题的核心).即使lambda的参数明确定义为C类,它仍然返回它,就像从基类访问属性一样.

我正在寻找的是一种从lambda表达式获取MemberInfo的方法,就好像我已经使用参数类型的反射来获取MemberInfo.我的项目本质上将MemberInfos存储在各种字典中,它需要具有可以通过提供lambda表达式来访问元素的功能.

重复的代码示例由Danny Chen提供

public class Base
{
    public string Name { get; set; }
}
public class Derived : Base …
Run Code Online (Sandbox Code Playgroud)

c# lambda

22
推荐指数
3
解决办法
8278
查看次数

如何从方法符号中获取MethodInfo

是否可以从方法符号中获取MethodInfo对象?

所以同样如下:

typeof(SomeClassSymbol) // this gets you a Type object
Run Code Online (Sandbox Code Playgroud)

这是我想要做的:

public class Meatwad
{
    MethodInfo method;

    public Meatwad()
    {
        method = ReflectionThingy.GetMethodInfo(SomeMethod);
    }

    public void SomeMethod() { }

}
Run Code Online (Sandbox Code Playgroud)

我怎么能实现ReflectionThingy.GetMethodInfo?鉴于这甚至可能,重载方法怎么样?

.net c# reflection

6
推荐指数
2
解决办法
5117
查看次数

将C#方法名称转换为文本

我在Visual Studio 2013中使用通用处理程序.

我想要做的是创建一个包含方法名称的URL,但我希望方法的名称是真正的代码,这样它就不会被硬编码,如果函数名称被更改则跟随它.

如果我用C或C++这样做,我会说:

#define GENERATE_REFERENCE(text) #text
Run Code Online (Sandbox Code Playgroud)

我真的不在乎它是一个方法调用,因为我在这里有原型

我在尝试做的C#中的"伪代码":

public class MyClass {
    public void SayHello (String name)
    {
    ...
    }

    public void GenerateLink()
    {
         url = "... "+GenerateReference(this.SayHello);
         // url would be "... SayHello";

    }
    public String GenerateReference( DataType method )
    {
         // Is there some way to do this?
         return method.MethodName.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题与方法参考C#中建议的重复问题get methodinfo不同,因为我的问题来自一个对C#机制(新手)非常无知的地方.可疑的重复问题意味着更高层次的理解,远远超出我在我的问题中所表明的理解 - 我不太了解这个问题.我从来没有从我的搜索中找到这个答案.

c#

4
推荐指数
3
解决办法
3349
查看次数

如何获取Array.IndexOf <string>(string [],string)MethodInfo?

如何获得MethodInfoArray.IndexOf<string>(string[], string)

我尝试使用此代码,但不起作用.

typeof(Array).GetMethod("IndexOf", 
 BindingFlags.Public | BindingFlags.Static, null, 
  new Type[] { typeof(string[]), typeof(string) }, null);
Run Code Online (Sandbox Code Playgroud)

c# reflection

1
推荐指数
1
解决办法
4050
查看次数

标签 统计

c# ×6

reflection ×4

.net ×1

lambda ×1