标签: dynamic-keyword

测试动态变量上的属性是否可用

我的情况很简单.在我的代码的某处我有这个:

dynamic myVariable = GetDataThatLooksVerySimilarButNotTheSame();

//How to do this?
if (myVariable.MyProperty.Exists)   
//Do stuff
Run Code Online (Sandbox Code Playgroud)

所以,基本上我的问题是如何检查(不抛出异常)我的动态变量上有某个属性可用.我可以做,GetType()但我宁愿避免,因为我真的不需要知道对象的类型.我真正想知道的是一个属性(或方法,如果让生活更轻松)是可用的.有什么指针吗?

c# dynamic dynamic-keyword

217
推荐指数
7
解决办法
11万
查看次数

C#4.0 Dynamic vs Expando ......它们适合哪里?

我正在尝试学习C#4.0附带的所有新东西.我无法理解DynamicObjectExpandoObject类型之间的差异.它似乎DynamicObject用于例如当您想要从Python脚本访问变量以及ExpandoObject与COM/Office对象交谈时.我对吗?它们的用途有何不同?

dynamic-keyword expandoobject dynamicobject c#-4.0

49
推荐指数
1
解决办法
3万
查看次数

F#:有没有办法扩展monad关键字列表?

在F#monad中,如果你说let!,编译器会将其转换为Bind你在monad构建器上定义的成员.

现在我看到有一个Query monads,如MSDN所示,你可以说:

query {
    for student in db.Student do
    select student
    count
}
Run Code Online (Sandbox Code Playgroud)

selectcount,例如,将被翻译到QueryBuilder成员Linq.QueryBuilder.SelectLinq.QueryBuilder.Count.

我的问题是,关键字映射到成员是否已硬连接到F#编译器,还是可扩展?例如,我可以这样说:

FooMonadBuilder() {
    bar
}
Run Code Online (Sandbox Code Playgroud)

并以某种方式告诉F#编译器bar映射到一个FooMonadBuilder.Bar()方法?

monads f# dynamic-keyword computation-expression

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

为什么动态关键字不能用于动态加载的程序集?

我正在研究一个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)

c# dynamic-keyword dynamic-assemblies

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

C#使用Dynamic关键字通过字符串访问属性而不进行反射

我想写类似以下内容:

//  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"的包以某种方式实现了这种类型的功能. …

c# dynamic dynamic-keyword

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

C# - 禁用动态关键字

有没有办法禁止在.net 4中使用"dynamic"关键字?

我认为如果使用动态关键字,VS2010的代码分析功能可能有一个规则使构建失败,但我不能解决问题.

c# late-binding visual-studio-2010 late-bound-evaluation dynamic-keyword

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

C#中动态类型的限制

你能否告诉我一些C#中动态类型限制的原因?我在"Pro C#2010和.NET 4平台"中读到了它们.这是摘录(如果引用书籍在这里是非法的,请告诉我,我将删除摘录):

虽然可以使用dynamic关键字定义很多东西,但是它的使用存在一些限制.虽然它们不是show stoppers,但要知道动态数据项在调用方法时不能使用lambda表达式或C#匿名方法.例如,以下代码将始终导致错误,即使目标方法确实采用了一个带有字符串值并返回void的委托参数.

dynamic a = GetDynamicObject(); 
// Error!  Methods on dynamic data can’t use lambdas! 
a.Method(arg => Console.WriteLine(arg));
Run Code Online (Sandbox Code Playgroud)

要绕过此限制,您需要使用第11章(匿名方法和lambda表达式等)中描述的技术直接使用底层委托.另一个限制是动态数据点无法理解任何扩展方法(参见第12章).不幸的是,这还包括来自LINQ API的任何扩展方法.因此,使用dynamic关键字声明的变量在LINQ to Objects和其他LINQ技术中的使用非常有限:

dynamic a = GetDynamicObject(); 
// Error!  Dynamic data can’t find the Select() extension method! 
var data = from d in a select d;
Run Code Online (Sandbox Code Playgroud)

提前致谢.

c# dynamic-keyword

5
推荐指数
2
解决办法
3328
查看次数

在C#中使用dynamic来访问匿名类型的字段 - 可能吗?

我有一个控制器方法:

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.

c# anonymous-types dynamic-keyword

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

动态关键字是否*仅*用于动态语言?

我参加代号营12日前,和扬声器也表示,新dynamic的C#4.0的关键字应该只用于动态语言interopping.我认为他也说过,与正常反射(它本身有点慢)相比,它有点慢.

但后来我听到斯科特汉塞尔曼提到动态关键词"使反思不那么痛苦".

因此,为了反映不是来自动态代码的对象,使用dynamic关键字是否可以接受?

c# reflection dynamic dynamic-keyword c#-4.0

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

为什么对ref return属性的动态调用会引发异常?

我一直在研究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)

c# dynamic-keyword

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

C# - 动态关键字和接口实现

我假设这是不可能的,但在进一步挖掘之前有办法做这样的事情:

public void ProcessInterface(ISomeInterface obj) {}

//...

dynamic myDyn = GetDynamic<ISomeInterface>() 
ProcessInterface(myDyn);
Run Code Online (Sandbox Code Playgroud)

我看过一篇帖子争论它,但听起来它没有被包括在内.

一点上下文:通过COM公开的.Net程序集 - > Silverlight app消耗接口实现类.通过接口引用对象会很好.我真的不希望这是有意的......

c# silverlight .net-4.0 dynamic-keyword

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

如何在运行时创建一系列编号变量?

朋友们,我必须创建一系列ArrayLists,每个包含未知来源的对象,每个实例都分配给一个单独的局部变量.

到目前为止,这么好......但我还需要每个局部变量的名称遵循一个非常具体的模式:名称应以"oArr"开头,后跟一个或多个数字反映特定数组在序列中的位置.此外,我不会在编译时知道有多少这些数组 - 因此,我需要多少局部变量!

令我感到震惊的是,这可能是一个问题,可以通过C#4.0中动态类型的可用性来解决,但我对它们的使用并不熟悉.我怎么能拿这样的代码......

int i=0;
foreach(something)
{
    ArrayList oArr+i=new ArrayList();
    i++;
}
Run Code Online (Sandbox Code Playgroud)

...并将其转换为符合上述标准实际编译的内容?

或者,是否有一个更简单,理智的方法解决这个问题?

c# dynamic-typing dynamic-keyword c#-4.0

-3
推荐指数
1
解决办法
1672
查看次数