有可能,如果是这样,如何让Visual Studio在代码中突出显示动态表达式?
当我只是在一些代码上面徘徊时,visual studio告诉我这是一个动态表达.这让我意识到我在我的代码中犯了一个错误并使用了一个动态太多.但我也意识到,如果我没有徘徊,那么应该是静态的"大片"动态代码就会逃脱.
所以我想知道是否有可能使Visual Studio改变动态表达式的背景颜色,因此这些部分将清晰可辨.
[edit]
动态表达式是指在常规代码中使用dynamic关键字.
dynamic-language-runtime syntax-highlighting visual-studio-2010 visual-studio dynamic-code
在C#中使用DLR的一个例子如下:
dynamic dyn = new MyObject();
dyn.MyMethod(); //resolved at runtime
Run Code Online (Sandbox Code Playgroud)
什么是F#中的等价物?
谢谢.
当我想在C#中的任何对象上动态调用静态定义的(在"编译时确定"意义上的"静态",而不是"类级别成员"意义上的)方法时,我可以使用反射来获取该方法的句柄并调用它:
typeof(Foo).GetMethod("Bar").Invoke(foo, new object[] { /* params */ });
Run Code Online (Sandbox Code Playgroud)
但是,通过继承DynamicObject响应(未定义的)实例方法调用而使对象变为TryInvokeMember动态,并且由于显而易见的原因,类不响应的动态方法不会通过反射公开.这意味着我无法获得应该响应的方法的方法句柄TryInvokeMember.
具有讽刺意味的是,在我看来,您无法dynamic像在非dynamic对象上调用已定义的方法那样轻松地动态调用对象上的动态方法.
我考虑过TryInvokeMember直接调用,但第一个参数必须是InvokeMemberBinder一个抽象类的实例.我觉得如果我必须实现一个类来调用动态对象的动态方法,我一定是做错了.
如何dynamic通过名称调用对象上的方法,知道目标类没有实现它并且应该响应使用它TryInvokeMember?
扫描互联网,我很难以一种简单的方式理解- 术语呼叫网站(@dlr).我一直在这里读到CallSite是:
一个网站说
调用方法的位置.
一本书说:
呼叫网站.这是DLR的一种原子 - 可以被视为单个单元的最小代码片段.一个表达式可能包含许多呼叫站点,但行为是以自然方式构建的,一次评估一个呼叫站点.对于剩下的讨论,我们一次只考虑一个呼叫站点.有一个呼叫站点的小例子可以参考,所以这里有一个非常简单的例子,其中d当然是动态类型的变量
d.Foo(10); 调用站点在代码中表示为System.Runtime.CompilerServices.CallSite.
另一本书说:
编译器发出的代码最终会生成一个描述操作的表达式树,由DLR在运行时绑定的调用站点管理.呼叫站点本质上充当呼叫者和被呼叫者之间的中介.
对不起,我不能看到这3个解释组合成一个简单的解释.
我很乐意得到一个简单的解释:
我可以解释一下我的妻子 - 电话网站是什么?
.Net 4.0会使用新版本的CLR(v2.1,3.0)还是会坚持使用现有的v2.0?
补充:是否可能与CLR v2.0保持一致并添加DLR v1.0?
更新:虽然这可能看起来像一个无法回答的推测性问题,但VS团队似乎正在发布关于VS10和.Net 4.0的越来越多的信息,所以很快就不会出现这种情况.(可在此处获取信息 - > http://msdn.microsoft.com/en-us/vstudio/products/cc948977.aspx)
在动态语言运行时(DLR) 有表达的一些很酷的代码,其中包括一些非常漂亮的代码打印出来,我想使用,使表达式树:
int a = 1;
int b = 2;
Expression<Func<int, int>> expression = (c) => a + (b * c)
expression.Evaluate(5, stringBuilder)
Run Code Online (Sandbox Code Playgroud)
输出:
(5) => a + (b * c) = 11 Where
a = 1
b * c = 10 Where
b = 2
c = 5
Run Code Online (Sandbox Code Playgroud)
我在网上发现了一些代码,但发现只有表达式没有参数时它才有效.
然后我发现了类似方法的DLR实现.然而,DLR有自己的Expression类和许多其他标准C#类型的自定义实现,所以我有点困惑.谁知道我怎么能实现上述?
有没有办法在F#中访问类似于C#dynamic的DLR对象(例如,DynamicObject子类实例)成员(属性和方法)?
随着.NET 4.0 beta的推出,以及.NET动态语言运行时的广泛可用性,我猜这些主题将变得"更热".
我对DLR和PowerShell之间的概念差异感到困惑.在我看来,如果我想在我的.NET应用程序中提供脚本功能,我可以使用DLR(以及在IronPython或IronRuby中启用脚本,或者可用于DLR的任何其他Iron*语言),或者托管PowerShell运行空间.
每种方法的优缺点是什么?为什么我可以选择一个而不是另一个?作为一种动态语言本身,以及一流的.NET语言,PowerShell为何也不针对DLR?
这是一个与我在这里问到的另一个相关的分支问题.我把它分开了,因为它真的是一个子问题:
我很难将类型的对象转换dynamic为另一种(已知的)静态类型.
我有一个执行此操作的ironPython脚本:
import clr
clr.AddReference("System")
from System import *
def GetBclUri():
return Uri("http://google.com")
Run Code Online (Sandbox Code Playgroud)
请注意,它只是新建了一个BCL System.Uri类型并返回它.所以我知道返回对象的静态类型.
现在在C#land,我正在新建脚本托管的东西,并调用此getter返回Uri对象:
dynamic uri = scriptEngine.GetBclUri();
System.Uri u = uri as System.Uri; // casts the dynamic to static fine
Run Code Online (Sandbox Code Playgroud)
没问题.我现在可以使用强类型的Uri对象,就像它最初静态实例化一样.
然而....
现在我想定义我自己的C#类,它将在动态范围内新建,就像我对Uri一样.我简单的C#类:
namespace Entity
{
public class TestPy // stupid simple test class of my own
{
public string DoSomething(string something)
{
return something;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在在Python中,新建一个这种类型的对象并返回它:
sys.path.append(r'C:..path here...')
clr.AddReferenceToFile("entity.dll")
import Entity.TestPy
def GetTest(): …Run Code Online (Sandbox Code Playgroud) 如何转换表单的ExpressionTree
Expression<Func<POCO1, bool>> exp = p => p.Age > 50;
Run Code Online (Sandbox Code Playgroud)
至
Expression<Func<POCO2, bool>> exp2 = p => p.Age > 50;
Run Code Online (Sandbox Code Playgroud)
其中POCO1和POCO2是C#对象,并且都具有Int32 Age属性
c# ×5
.net ×4
.net-4.0 ×2
dynamic ×2
f# ×2
clr ×1
dynamic-code ×1
ironpython ×1
lambda ×1
linq ×1
powershell ×1
scripting ×1
string ×1
versioning ×1