Tag: 动态

将动态对象传递给C#方法会更改返回类型

我创建了一个inheritanceDynamicObject的类,并希望创建一个静态方法,该方法可以创建具有预定属性的新实例(存储在Dictionary )。 public class CustomDynamic : DynamicObject { protected Dictionary InnerDictionary; public static T Create(Dictionary dictionary) where T : CustomDynamic , new() { return new T { InnerDictionary = dictionary }; } } 用法: dynamic d = new Dictionary(); var realPlayer = CustomDynamic.Create(d as Dictionary); var dynaPlayer = CustomDynamic.Create(d); realPlayer // Player type according to […]

基于接口的方法调用是否应该使用“动态”仍遵循C#方法解析规则?

据我所知,每种语言都有自己的dynamic处理程序,因此适用相应的规则。 我不确定以下是否正确/不正确; 想法? 场景:使用一些方法的两个接口(一个实现另一个): public interface IA { void Bar(object o); } public interface IB : IA { void Foo(object o); } 和一个基本的实现: public class B : IB { public void Foo(object o) { Console.WriteLine(“Foo”); } public void Bar(object o) { Console.WriteLine(“Bar”); } } 现在,使用正常的C#(无dynamic ),我们可以从IB类型的目标访问IA方法: IB b = new B(); var o = new […]

如何使用动态对象类型创建List

如何创建新的List ,其中T是动态 Type对象。 我有 dynamic DyObj = new ExpandoObject(); if (condition1) { DyObj.Required = true; DyObj.Message = “This is the first property being accessed through dynamic object”; } if (condition2) { DyObj.Required = false; DyObj.Message = “This is the second property….”; } // and so on… 我想创建List并根据条件将所有消息分配给Dyobj 。 跟进评论中的数据: var DyObjectsList = new List; dynamic […]

我可以在.NET 4中序列化ExpandoObject吗?

我正在尝试使用System.Dynamic.ExpandoObject因此我可以在运行时动态创建属性。 稍后,我需要传递此对象的实例,并且使用的机制需要序列化。 当然,当我尝试序列化我的动态对象时,我得到了exception: System.Runtime.Serialization.SerializationException未处理。 在Assembly’System.Core中输入’System.Dynamic.ExpandoObject’,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089’未标记为可序列化。 我可以序列化ExpandoObject吗? 是否有另一种方法来创建可序列化的动态对象? 也许使用DynamicObject包装器? 我创建了一个非常简单的Windows窗体示例来复制错误: using System; using System.Windows.Forms; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Dynamic; namespace DynamicTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { dynamic dynamicContext = new ExpandoObject(); dynamicContext.Greeting […]

动态属性的Asp.Net MVC 3编辑器

我们一直试图让编辑模板与动态属性一起工作 – 无济于事。 也许你们中的一个可以帮助我们。 这大致是我们的课程: public class Criterion { … public string Text { get; set; } public dynamic Value { get; set; } public Type Type { get; set; } … } 我们的剃刀视图获得了一个包含一系列部分的模型,每个部分都包含一个标准列表。 (我们在运行时获得这些信息。)所有这些标准都应该以编辑模式显示 – 关于它们的实际类型:(摘录) @for (int i = 0; i < model.Sections.Count(); i++) { for (int j = 0; j < model.Sections[i].Criteria.Count(); […]

当用作generics类型参数时,为什么“动态”不是所有类型的协变和逆变?

我想知道当用作generics类型参数时, dynamic是否在语义上等同于object 。 如果是这样,我很好奇为什么存在这种限制,因为在为变量或forms参数赋值时两者是不同的。 我在C#4.0中编写了一个小实验来梳理一些细节。 我定义了一些简单的接口和实现: interface ICovariance { T Method(); } interface IContravariance { void Method(T argument); } class Covariance : ICovariance { public T Method() { return default(T); } } class Contravariance : IContravariance { public void Method(T argument) { } } 实验的有趣细节: class Variance { static void Example() { ICovariance c1 = […]

通过动态访问generics类型的成员时的StackOverflowException:.NET / C#framework bug?

在一个程序中,我使用dynamic关键字来调用最佳匹配方法。 但是,我发现在某些情况下框架会因StackOverflowException崩溃。 我尽可能地尝试简化我的代码,同时仍然能够重新产生这个问题。 class Program { static void Main(string[] args) { var obj = new SetTree(); var dyn = (dynamic)obj; Program.Print(dyn); // throws StackOverflowException!! // Note: this works just fine for ‘everything else’ but my SetTree } static void Print(object obj) { Console.WriteLine(“object”); } static void Print(ISortedSet obj) { Console.WriteLine(“set”); } } 如果ISortedSet实例实现ISortedSet接口并打印“对象”,那么该程序通常会打印“set”。 但是,通过以下声明,将抛出StackOverflowException (如上面的注释中所述)。 […]

使用C#中Dynamic Linq中的“Contains”关键字查询数据

我在C#中执行动态linq中包含’Contains’关键字的查询时遇到了一些问题。 我收到以下错误 “Int32”类型中不存在任何属性或字段 我的代码如下: 如果我为数据类型字符串字段使用’Contains’关键字,那么它可以正常工作,如下所示 string[] CandidateNamesArray = new string[]{“Ram”, “Venkat”, “Micheal”} var dynamicLinqQuery = Candidates.Where(“CandidateName.Contains(@0)”, CandidateNamesArray ); 工作良好 但是如果我对数据类型int字段使用’Contains’关键字,那么它会抛出exception,如下所示 int[] CandidateIdsArray = new int[]{4, 78, 101} var dynamicLinqQuery = Candidates.Where(“CandidateId.Contains(@0)”, CandidateIdsArray); 运行时exception – “类型’Int32’中不存在适用的方法’包含’” 也尝试以下面的另一种方式 int[] CandidateIdsArray = new int[]{4, 78, 101} var dynamicLinqQuery = Candidates.Where(“@0.Contains(CandidateId)”, CandidateIdsArray); 运行时exception – “类型’Int32’中不存在属性或字段’CandidateId’” 我花了将近2天的时间来解决上述问题,但未能成功。 任何人都可以帮我解决上述问题……先谢谢

有没有办法在C#中进行动态隐式类型转换?

给定此类具有隐式转换运算符: public class MyDateTime { public static implicit operator MyDateTime(System.Int64 encoded) { return new MyDateTime(encoded); } public MyDateTime(System.Int64 encoded) { _encoded = encoded; } System.Int64 _encoded; } 我现在可以做以下事情: long a = 5; MyDateTime b = a; 但不是以下内容: long f = 5; object g = f; MyDateTime h = g; 这给出了编译时间: 无法将类型’object’隐式转换为’MyDateTime’。 我感觉合理。 现在我修改前面的例子如下: long f […]

将具体对象类型作为generics方法的参数传递

我有一个使用通用方法的API如下 public static class DataProvider { public static Boolean DeleteDataObject(Guid uid, IDbConnection dbConnection) { // Do something here } public static IDbConnection GetConnection() { // Get connection } } 我的应用程序包含在运行时使用CodeDOM生成的类,为了跟踪我创建了一个名为IDataObject的接口。 我试图将每个对象的具体类型传递给上面的generics方法,如下所示: public static Boolean PurgeDataObject(this IDataObject dataObject, Guid uid) { return DataProvider.DeleteDataObject(uid, DataProvider.GetConnection()); } dataObject包含从IDataObjectinheritance的类的实例。 我有兴趣获得该类型并将其作为T传递。 我试图找出是否有可能在某种程度上使用dynamic这里。 typeof()和GetType()不能像Here中所述那样工作