我想得到方法System.Linq.Queryable.OrderyBy<T, TKey>(the IQueryable<T> source, Expression<Func<T,TKey>> keySelector)方法,但我不断提出空值.
var type = typeof(T);
var propertyInfo = type.GetProperty(group.PropertyName);
var propertyType = propertyInfo.PropertyType;
var sorterType = typeof(Func<,>).MakeGenericType(type, propertyType);
var expressionType = typeof(Expression<>).MakeGenericType(sorterType);
var queryType = typeof(IQueryable<T>);
var orderBy = typeof(System.Linq.Queryable).GetMethod("OrderBy", new[] { queryType, expressionType }); /// is always null.
Run Code Online (Sandbox Code Playgroud)
有没有人有任何见解?我宁愿不循环GetMethods结果.
我遇到了一个我没想到的问题.一个例子可能比一段更好地说明我的问题:
更新:跳转到最后一个代码块,以获得更有说服力的代码示例.
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#代码,必须使用魔术字符串来表达属性名称.每个人都知道魔术弦的问题.它们很难重构,它们没有编译时检查,并且通常会导致难以诊断的问题.然而,C#/ .NET 在整个地方使用它们来表示属性/类/方法名称.
这个问题已持续多年和多年,目前唯一可行的解决方案是使用表达式树,然后在运行时解析属性名称.这使您获得令人满意的编译时检查,但它使代码复杂化(需要Expression类型的参数),并且会产生运行时成本.
有没有人知道是否有一个特性考虑因为C#/ .NET添加编译时反射来克服这个普遍存在的问题?
看起来这将是一个简单的补充,它将是一个非破坏性的变化,它将使许多开发人员受益匪浅.typeof()运算符已经执行了编译时反射的形式,因此看起来运算符nameof()(或类似的东西)将非常互补.
此外,有没有人知道这个功能的任何潜在问题?
谢谢您的帮助.
typeof当我们想要获取指定类型的Type实例时,我们可以使用C#关键字.但是,如果我想MethodInfo通过它的参考得到一个方法,我可以使用什么?
例如,我有一个简单的控制台应用程序.它包含Program.Main方法.我希望MethodInfo通过使用类似的东西methodinfoof(Program.Main).我有这个问题,因为方法名称可能会改变,所以我不能只使用Type.GetMethodInfo(string MethodName)它.
我有大约10 000种方法可供我使用MethodInfo,因此在我的方法中添加任何自定义属性或其他任何方法都不是解决方案.
是否可以在同一个类中获取另一个方法的名称但不使用手动编写的字符串?
class MyClass {
private void doThis()
{
// Wanted something like this
print(otherMethod.name.ToString());
}
private void otherMethod()
{
}
}
Run Code Online (Sandbox Code Playgroud)
你可能会问为什么:原因是我必须稍后像这个Invoke("otherMethod")一样调用该方法,但是我不想自己对这个字符串进行硬编码,因为我无法在项目中重构它.
有sizeof()和typeof(),但为什么不memberinfo()返回的实例System.Reflection.MemberInfo为代码,以便在反射代码,以帮助选择的一部分.
例:
Program()
{
Type t = typeof(Foo);
Foo foo = new Foo();
PropertyInfo pi = memberinfo(Foo.Name) as PropertyInfo;
// or shall it be like this
// PropertyInfo pi = memberinfo(foo.Name) as PropertyInfo;
string name = pi.GetValue(foo, null);
}
Run Code Online (Sandbox Code Playgroud)
我试图了解是否有一个根本原因可以在C#规范中实现.
我不是在抨击任何事情,我只是在做一些一厢情愿的想法,所以请善待.
几年前,Eric Lippert发表了一篇关于假设的 infoof 运算符的博客,它允许您在编译时而不是在运行时获取方法/属性信息。基本上是说它是一匹漂亮的小马,但不是独角兽......
我读了一些关于 Rosyln 在编译时重写代码的能力,使用 Roslyn 实现 infoof 会有多困难?
编辑:我认为这可能是一种获得 Eric 所说的他们正在考虑的所有内容的方法,但我应该对功能进行一些分解,以防万一。
以重构安全的方式,在编译时得到验证。就我个人而言,1 涵盖了我实际使用的大约 90%(用于获取来电者姓名的新来电者信息属性实际上可以覆盖大约 60%,但当然,如果有一种在方法内部和外部都有效的方法,那会更可取)。
我想动态生成一个linq.expressions.expression语句,我可以将其用作过滤器.
这是一个示例Linq查询,我想将其转换为Expression:
ctx.customer.where(c=>ctx.Invoice.Any(i=>i.customerId == c.id));
Run Code Online (Sandbox Code Playgroud)
这是我的尝试
using System.Linq.Expressions;
var c = Expression.parameter(typeof(Customer),"c");
var i = Expression.parameter(typeof(Invoice),"i");
var rightPart= Expression.Equal(
Expression.propertyorField(i,"customerId"), Expression.propertyorfield(c,"id")
Run Code Online (Sandbox Code Playgroud)
请协助.
我想获得被委派为Func的方法的名称.
Func<MyObject, object> func = x => x.DoSomeMethod();
string name = ExtractMethodName(func); // should equal "DoSomeMethod"
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
- 吹牛的权利 -
Make ExtractMethodName也可以使用属性调用,让它返回该实例中的属性名称.
例如.
Func<MyObject, object> func = x => x.Property;
string name = ExtractMethodName(func); // should equal "Property"
Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×4
lambda ×3
reflection ×3
methodinfo ×2
compile-time ×1
delegates ×1
generics ×1
invoke ×1
linq ×1
magic-string ×1
method-names ×1
roslyn ×1
typeof ×1