Tag: 动态

ValueTypes的动态表达式生成问题

我构建了一个框架,允许对表中的报表数据进行级联排序,具体取决于哪个列是主排序列。 它在很大程度上起作用,除了一个特定但重要的情况:当字段的属性是值类型时。 我收到以下错误消息: System.ArgumentException:类型’System.Int32’的表达式不能用于返回类型’System.Object’ 我知道这意味着我需要设置ValueType的值,但我不完全确定如何在这种特殊情况下。 根据一些研究和这个SO答案,我认为我需要以某种方式使用Expression.Convert 。 我的代码是生成表达式的代码。 generics类型参数T是数据“行”的类型。 GetFullSortOrder()只返回一个字符串数组,这些字符串表示类型T中也将进行排序的列(属性)的名称。 public IEnumerable<Expression<Func>> GetExpressions(string sortedColumn) where T : IReportRecord { var columns = GetFullSortOrder(sortedColumn) var typeParameter = Expression.Parameter(typeof(T)); foreach (var c in columns) { var propParameter = Expression.Property(typeParameter, c); yield return Expression.Lambda<Func>(propParameter, typeParameter); } } 当在T中选择的属性是ValueType时处理Expression.Lambda<Func>()时抛出exception。 属性框需要什么,或者在运行时才知道类型时返回正确的值?

为什么在尝试使用动态参数调用扩展方法时出现错误CS1973

请考虑以下代码: internal static class Program { public static string ExtensionMethod(this string format, dynamic args) { return format + args.ToString(); } private static void Main() { string test = “hello “; dynamic d = new { World = “world” }; // Error CS1973 ‘string’ has no applicable method named ‘ExtensionMethod’ // but appears to have an […]

带数字键的动态json对象

我有一个json对象,我在这个答案的帮助下转换为动态C#对象。 它工作得很好,但麻烦的是这个对象有数字键。 例如, var jsStr = “{address:{“100″: {…}}}”; 所以我不能这么做 dynObj.address.100 而且,据我所知,我不能使用索引器来获取这样的对象 dynObj.address[“100”] 请向我解释如何让这个工作。

动态LINQ查询ExpandoObject?

有没有办法使用LINQ动态查询库(System.Linq.Dynamic)根据ExpandoObject的属性评估条件? 以下代码在“ var e… ”行引发exception,说“ExpandoObject类型中不存在属性或字段’权重”: – const string TestCondition = “MyStateBag.Foo >= 50 && MyStateBag.Bar >= 100”; dynamic myStateBag = new ExpandoObject(); myStateBag.Foo = 70; myStateBag.Bar = 100; var p = Expression.Parameter(typeof(ExpandoObject), “MyStateBag”); var e = DynamicExpression.ParseLambda(new[] { p }, null, TestCondition); var result = e.Compile().DynamicInvoke(myStateBag); Assert.IsTrue(result); 替代方案是将“statebag”实现为字典,但这将导致稍微更详细的条件字符串,例如MyStateBag[“Foo”] >= 50 && MyStateBag[“Bar”] >= 100 。 […]

将mongodb集合查询为动态

我在我的数据库中保存了一个dynamic对象,但我还希望将其作为动态对象进行检索。 如何才能做到这一点? 我试过这样: public dynamic GetItemById(ObjectId id) { dynamic result = Db.GetCollection(“Items”).Find(x => x.Id == id).FirstOrDefaultAsync().Result; return result; } 但这给了我以下错误: CS1963表达式树可能不包含动态操作 我知道这可以通过使用类型化对象而不是动态对象来修复。 但我不想使用任何类型的对象,因为这种方式违背了使用像MongoDB(或至少是imho)这样的NoSQL数据库的全部目的。 如何使用dynamic对象通过Id或任何其他属性查询我的集合?

如何覆盖动态对象属性的get访问器

我们假设我有以下课程: public class Person { public string Name { get; set; } public string Surname { get; set; } public string FullName { get { return Name + ” ” + Surname; } } } 以下块: Person person = new Person(); person.Name = “Matt”; person.Surname = “Smith”; return person.FullName; Matt Smith会回来的。 让我们将Person类型更改为动态ExpandoObject 。 代码如下所示: dynamic […]

MemberWiseClone如何使用克隆属性创建新对象?

我想创建一个更受限制的MemberwiseClone版本,但是我意识到我自己的C#代码可以为对象添加属性的唯一方法是使用dynamic ,但这不能给对象提供与原始对象相同的类型。 另一个更丑陋的选择是为新克隆发出源代码并在运行时编译它,但这会带来复杂性。 assembly参考等,我不关心保持简单。 现在我只是使用MemberwiseClone ,但我真的很好奇它是如何工作的。 我找不到任何反编译的来源。

在Linq查询中使用动态列名称

foreach (Dimension dimensions in Enum.GetValues(typeof(Dimension))) { var r = new ReferenceTable(dimensions).referenceItems; List qry = TVRawDataList.Where(p => !r.Any(d => d.Value == p.BrandVariant)) .ToList(); DimensionItem di = new DimensionItem(qry, dimensions); newDimensions.Add(di); } 我正在尝试创建一个Linq查询,将TVRawDataRecords列表与TVRawDataRecords枚举中的列表进行比较,如果没有匹配,则将它们添加到新的DimensionIem列表中。 这一切都运行正常,但我需要动态p.BrandVariant我的Where语句中的p.BrandVariant和维度枚举值,因为维度值与TVRawDataRecord属性名称相同。 这意味着我可以只用这几行代码来循环8个维度等。 有人可以解释我在Where语句中包含维度的方式吗? 谢谢!

使用动态类型调用generics扩展方法

我正在尝试执行返回类型为T的对象的扩展方法,但我正在尝试根据Header / Detail动态generics类型来设置类型T dynamic。 这可能有点冗长…… using System; using System.Collections.Generic; namespace Blah { public interface IHeader { string Name { get; set; } IDetail Detail { get; set; } } public interface IDetail { //Nothing the ‘Real’ implementation of this //interface will have it’s own properties. } public class GenericHeader : IHeader { public string Name […]

动态命名空间切换

我正在尝试将Web服务包装器放在几个第三方Web服务上。 为了这个问题,我们将与其中两个合作: OrderService AddressService 这两个服务都具有在不同名称空间中定义的相同对象: OrderService.AuthenticationParameters AddressService.AuthenticationParameters 我希望能够创建一个能够在名称空间之间检测/切换的基类。 例如: public abstract class BaseLogic { internal BaseLogic() { /* Initialize authParams */ //Switch out / detect namespace here this.authParams = new OrderService.AuthenticationParameters(); this.authParams.accountName = “[MyAccountName]”; this.authParams.userName = “[MyUserName]”; this.authParams.password = “[MyPassword]”; } } 我见过几个类似的问题。 要么它们不适用于我的情况,要么我无法理解它们。 问题:我正在努力实现的目标是什么? 如果有可能,我是否过于复杂化? 附加信息:最终,将有两个以上的服务共享此公共对象。 供应商为它们提供的每个function分支提供单独的服务URL。