我的情况很简单.在我的代码的某处我有这个:
dynamic myVariable = GetDataThatLooksVerySimilarButNotTheSame();
//How to do this?
if (myVariable.MyProperty.Exists)
//Do stuff
Run Code Online (Sandbox Code Playgroud)
所以,基本上我的问题是如何检查(不抛出异常)我的动态变量上有某个属性可用.我可以做,GetType()但我宁愿避免,因为我真的不需要知道对象的类型.我真正想知道的是一个属性(或方法,如果让生活更轻松)是可用的.有什么指针吗?
我正在尝试学习C#4.0附带的所有新东西.我无法理解DynamicObject和ExpandoObject类型之间的差异.它似乎DynamicObject用于例如当您想要从Python脚本访问变量以及ExpandoObject与COM/Office对象交谈时.我对吗?它们的用途有何不同?
在F#monad中,如果你说let!,编译器会将其转换为Bind你在monad构建器上定义的成员.
现在我看到有一个Query monads,如MSDN所示,你可以说:
query {
for student in db.Student do
select student
count
}
Run Code Online (Sandbox Code Playgroud)
和select和count,例如,将被翻译到QueryBuilder成员Linq.QueryBuilder.Select和Linq.QueryBuilder.Count.
我的问题是,关键字映射到成员是否已硬连接到F#编译器,还是可扩展?例如,我可以这样说:
FooMonadBuilder() {
bar
}
Run Code Online (Sandbox Code Playgroud)
并以某种方式告诉F#编译器bar映射到一个FooMonadBuilder.Bar()方法?
我正在研究一个CSharp表达式求值程序,可以使用,如下所示.该组件生成代码并在内存中编译它,之后,它加载生成的程序集,创建生成的类的实例并运行它.结果保存在字典中.
我的问题是所有运行正常,直到最后一行代码失败,异常:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'object '不包含'FirstName'的定义.
但是,Visual Studio能够向我展示专业变量内容:
Professional = { FirstName = Juan Pablo,
LastName = Ibañez,
Certifications = <>f__AnonymousType0`3[System.String,System.String,System.String][],
SayHi = System.Action }
Run Code Online (Sandbox Code Playgroud)
这是代码:
static void Main(string[] args)
{
const string data = @"results[""professional""] =
new
{
FirstName = ""Juan Pablo"",
LastName = ""Ibañez"",
Certifications = new[]
{
new { Provider=""MSFT"", ExamCode = ""70-536"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" },
new { Provider=""MSFT"", ExamCode = ""70-505"", Title = ""TS: Microsoft .NET Framework – Application Development …Run Code Online (Sandbox Code Playgroud) 我想写类似以下内容:
// I will pass in a number of "properties" specified as strings that I want modified
string[] properties = new [] { "AllowEdit", "AllowDelete" };
// Casting the component I'm using to a dynamic object of some sort ?
dynamic d = myGridComponent;
// Iterate over the strings and set the properties
foreach(var s in properties)
{
//d.s = true; //
//d[s] = true; // this format would be ideal
}
Run Code Online (Sandbox Code Playgroud)
我在想,如果有一个简单的方法来做到这一点,而无需使用反射[ .GetProperty(...).GetValue(...,...)使用新的C#4.0关键字]: dynamic.
似乎可能有某种方式,......我只是不确定确切的机制,并且无法找到合适的资源来将所有部分组合在一起.
想法?
[编辑]看起来有一个名为"Clay"的包以某种方式实现了这种类型的功能. …
有没有办法禁止在.net 4中使用"dynamic"关键字?
我认为如果使用动态关键字,VS2010的代码分析功能可能有一个规则使构建失败,但我不能解决问题.
c# late-binding visual-studio-2010 late-bound-evaluation dynamic-keyword
你能否告诉我一些C#中动态类型限制的原因?我在"Pro C#2010和.NET 4平台"中读到了它们.这是摘录(如果引用书籍在这里是非法的,请告诉我,我将删除摘录):
虽然可以使用dynamic关键字定义很多东西,但是它的使用存在一些限制.虽然它们不是show stoppers,但要知道动态数据项在调用方法时不能使用lambda表达式或C#匿名方法.例如,以下代码将始终导致错误,即使目标方法确实采用了一个带有字符串值并返回void的委托参数.
Run Code Online (Sandbox Code Playgroud)dynamic a = GetDynamicObject(); // Error! Methods on dynamic data can’t use lambdas! a.Method(arg => Console.WriteLine(arg));要绕过此限制,您需要使用第11章(匿名方法和lambda表达式等)中描述的技术直接使用底层委托.另一个限制是动态数据点无法理解任何扩展方法(参见第12章).不幸的是,这还包括来自LINQ API的任何扩展方法.因此,使用dynamic关键字声明的变量在LINQ to Objects和其他LINQ技术中的使用非常有限:
Run Code Online (Sandbox Code Playgroud)dynamic a = GetDynamicObject(); // Error! Dynamic data can’t find the Select() extension method! var data = from d in a select d;
提前致谢.
我有一个控制器方法:
public JsonResult CalculateStuff(int coolArg)
{
if(calculatePossible)
return Json(CoolMethod(coolArg));
else return Json(new { Calculated = false });
}
Run Code Online (Sandbox Code Playgroud)
现在,我想测试一下.
public void MyTest
{
var controller = GetControllerInstance();
var result = controller.CalculateStuff().Data as dynamic;
Assert.IsTrue(result.Calculated == false);
}
Run Code Online (Sandbox Code Playgroud)
这会抛出一个RuntimeBinderException,表示未定义Calculated.有没有办法实现这个目标?
UPDATE
按照Jons的建议,我使用InternalsVisibleTo与我的测试组件交朋友.一切正常.谢谢Jon.
我参加代号营12日前,和扬声器也表示,新dynamic的C#4.0的关键字应该只用于动态语言interopping.我认为他也说过,与正常反射(它本身有点慢)相比,它有点慢.
但后来我听到斯科特汉塞尔曼提到动态关键词"使反思不那么痛苦".
因此,为了反映不是来自动态代码的对象,使用dynamic关键字是否可以接受?
我一直在研究c#7 引用返回功能,并且在运行测试片段之一时遇到了意外情况。
如下代码:
namespace StackOverflow
{
using System;
public interface IXTuple<T>
{
T Item1 { get; set; }
}
public class RefXTuple<T> : IXTuple<T>
{
T _item1;
public ref T Item1Ref
{
get => ref _item1;
}
public T Item1
{
get => _item1;
set => _item1 = value;
}
}
public struct ValXTuple<T> : IXTuple<T>
{
T _item1;
public T Item1
{
get => _item1;
set => _item1 = value;
}
}
public class UseXTuple
{
public void …Run Code Online (Sandbox Code Playgroud) 我假设这是不可能的,但在进一步挖掘之前有办法做这样的事情:
public void ProcessInterface(ISomeInterface obj) {}
//...
dynamic myDyn = GetDynamic<ISomeInterface>()
ProcessInterface(myDyn);
Run Code Online (Sandbox Code Playgroud)
我看过一篇帖子争论它,但听起来它没有被包括在内.
一点上下文:通过COM公开的.Net程序集 - > Silverlight app消耗接口实现类.通过接口引用对象会很好.我真的不希望这是有意的......
朋友们,我必须创建一系列ArrayLists,每个包含未知来源的对象,每个实例都分配给一个单独的局部变量.
到目前为止,这么好......但我还需要每个局部变量的名称遵循一个非常具体的模式:名称应以"oArr"开头,后跟一个或多个数字反映特定数组在序列中的位置.此外,我不会在编译时知道有多少这些数组 - 因此,我需要多少局部变量!
令我感到震惊的是,这可能是一个问题,可以通过C#4.0中动态类型的可用性来解决,但我对它们的使用并不熟悉.我怎么能拿这样的代码......
int i=0;
foreach(something)
{
ArrayList oArr+i=new ArrayList();
i++;
}
Run Code Online (Sandbox Code Playgroud)
...并将其转换为符合上述标准并实际编译的内容?
或者,是否有一个更简单,理智的方法解决这个问题?
dynamic-keyword ×12
c# ×10
c#-4.0 ×3
dynamic ×3
.net-4.0 ×1
f# ×1
late-binding ×1
monads ×1
reflection ×1
silverlight ×1