Tag: dynamic

为什么不能在C#中动态调度基本访问表达式?

我认为这个问题最好通过一个例子来理解,所以我们在这里: public class Base { // this method works fine public void MethodA(dynamic input) { // handle input } } public class Derived: Base { // Derived was named Super in my original post // This is also fine public void MethodB(dynamic input) { MethodA(input); } // This method does not compile and the compiler […]

如何在C#中使用DynamicObject实现事件访问器

我正在尝试使用C#的DynamicObject为Qt的类系统实现一个通用的Wrapper-Class。 但是,我想写下面的代码: dynamic obj = new SomeWrapperClass(….); // This extends DynamicObject obj.OnMyEvent += (Action)(() => Console.WriteLine(“DO something!”)); 以上是根据VS2010的有效代码(需要显式转换为Action),但是我如何使用DynamicObject的方法“捕获”该语句? 我尝试实现TryGetMember()并为语句调用它,但我不知道我必须返回什么才能使它工作。 任何提示?

C#4,动态关键字和后期绑定的CreateObject等价物?

如何在不引用库的情况下从程序标识符或ProgID(例如“Word.Application”)在C#4.0中创建动态COM / OLE / ActiveX对象? 在C#3.5中,我必须写一些类似的东西 Type comObjectType = Type.GetTypeFromProgID(progId, true); Activator.CreateInstance(comObjectType); 有没有更简单的方法在C#4.0中执行它,所以我可以将它分配给动态类型的变量(使用动态关键字)?

空传播算子和动态变量

我一直在研究C#6中的零传播运算符,并尝试使用dynamic类型的变量,但没有成功。 考虑下面的代码,它会编译,但是当将null传播应用于动态对象时,CLR会在运行时抛出AccessViolationException 。 class SomeType { public object SomeProperty { get; set; } static void Main() { var obj = new SomeType() { SomeProperty = “ABCD” }; var p1 = ((dynamic)obj).SomeProperty; //OK, p1 is set to “ABCD” var p2 = ((dynamic)obj)?.SomeProperty; //AccessViolationException Console.ReadLine(); } } 起初我认为这可能是一个bug,但后来我想到了struct 。 通常你不能申请?. 运算符到值类型变量(因为它不能为null)。 但是您可以将其转换为dynamic ,然后应用运算符。 所以我将SomeType更改为struct并得到了相同的exception。 问题是,通过设计,动态变量的空传播总是会抛出exception,因为底层对象可能是值类型? 无论如何, AccessViolationException都非常丑陋,在运行代码时是否获得相同的内容?

创建类似ASP.NET MVC 3 ViewBag的类?

我有一种情况,我希望做一些与ASP.NET MVC 3 ViewBag对象(在运行时创建属性)所做的事情相似的事情? 还是在编译时? 无论如何,我想知道如何用这种行为创建一个对象?

动态操作员解析

我有一个generics方法,通过将其中一个操作数转换为dynamic来调用运算符。 有两种不同的电话: //array is T[][] //T is MyClass array[row][column] != default(T) as dynamic 这工作并调用static bool operator !=(MyClass a, MyClass b) (即使双方都为null )。 让我感到惊讶的是以下行的行为: //array, a and b are T[][] //T is MyClass array[row][column] += a[line][i] * (b[i][column] as dynamic); 这叫 public static MyClass operator *(MyClass a, object b)和 public static MyClass operator +(MyClass a, object […]

如何在ExpandoObject中使用集合初始化程序语法?

我注意到新的ExpandoObject实现了IDictionary ,它具有必需的IEnumerable<KeyValuePair>和Add(string, object)方法,所以应该可以使用集合初始化语法来添加expando对象的属性与向字典中添加项目的方式相同。 Dictionary dict = new Dictionary() { { “Hello”, “World” } }; dynamic obj = new ExpandoObject() { { “foo”, “hello” }, { “bar”, 42 }, { “baz”, new object() } }; int value = obj.bar; 但似乎没有办法做到这一点。 错误: ‘System.Dynamic.ExpandoObject’不包含’添加’的定义 我认为这不起作用,因为接口是明确实现的。 但有没有办法解决这个问题? 这工作正常, IDictionary exdict = new ExpandoObject() as IDictionary(); exdict.Add(“foo”, “hello”); exdict.Add(“bar”, 42); […]

HyperDescriptor在.NET 4中构建时是否有效?

我正在开发一个.NET 4项目,并且能够从HyperDescriptor提供的动态属性访问中受益 ,但是当在.NET 4中构建时,它似乎无法正常工作。我从CodeProject下载了源代码,将解决方案的项目转换为VS2010,并将目标框架更新为4.0。 在构建并且示例正确执行时,时序显示使用HyperDescriptor进行动态属性访问是获取/设置对象值的最慢方式。 只有在使用.NET 4从源代码构建HyperDescriptor时,才会出现此问题。如果从.NET 4项目中添加对使用.NET 2构建的HyperDescriptor的引用,则可以正常工作。 这是目前可接受的解决方案,但是使用.NET 4构建会有一些潜在的优势吗? 任何人都想在HyperDescriptor上破解,看看为什么.NET 4版本的速度如此之慢?

将属性添加到ExpandoObject,其名称与字符串相同

有没有办法将属性添加到与字符串值同名的ExpandoObject? 例如,如果我有: string propName = “ProductNumber”; dynamic obj = new System.Dynamic.ExpandoObject(); 我可以创建属性ProductNumber,如: obj.ProductNumber = 123; 但是,我可以根据字符串propName创建属性obj.ProductNumber吗? 所以,如果我不知道该属性的名称将是什么,我可以根据此输入创建它。 如果使用ExpandoObject无法做到这一点,那么我应该研究C#的其他任何领域?

在Linq中使用.NET 4动态关键字的好例子?

所以我刚从亚马逊获得了使用C#4.0的LINQ to Objects的推荐:使用和扩展LINQ到对象和并行LINQ(PLINQ) 。 它说这本书介绍了使用Linq的dynamic关键字,这让我想到: 使用Linq无法做到的dynamic关键字可以做什么样的精彩呢?