C# 有有用的Null Conditional Operator。在这个答案中也有很好的解释。
我想知道当我的对象是动态/扩展对象时是否可以进行类似的检查。让我向您展示一些代码:
鉴于此类层次结构
public class ClsLevel1
{
public ClsLevel2 ClsLevel2 { get; set; }
public ClsLevel1()
{
this.ClsLevel2 = new ClsLevel2(); // You can comment this line to test
}
}
public class ClsLevel2
{
public ClsLevel3 ClsLevel3 { get; set; }
public ClsLevel2()
{
this.ClsLevel3 = new ClsLevel3();
}
}
public class ClsLevel3
{
// No child
public ClsLevel3()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我执行这种链式空检查,它会起作用
ClsLevel1 levelRoot = new ClsLevel1();
if (levelRoot?.ClsLevel2?.ClsLevel3 != null) …Run Code Online (Sandbox Code Playgroud) 我做了两个测试。
1- 添加 100k 个元素需要多长时间。
2- 他可以在 10 秒内使用 10 万个元素进行多少次搜索。
我的结果是这些
ExpandoObject 添加计数器 97075
字典添加计数器 35
ExpandoObject 搜索计数器 2396
字典搜索柜台 1957637
结论:
添加 ExpandoObject 元素要慢 2773 倍。
搜索 ExpandoObject 元素的速度慢了 817 倍。
为什么 ExpandoObject 比 Dictionary 慢得多?
using System;
using System.Dynamic;
using System.Collections.Generic;
using System.Threading;
namespace c_sharp_benchmark
{
class Program
{
static void Main(string[] args)
{
BenchmarkExpandoObjectAdd();
BenchmarkDictionaryAdd();
BenchmarkExpandoObjectSearch();
BenchmarkDictionarySearch();
}
static void BenchmarkExpandoObjectAdd()
{
dynamic exp = new ExpandoObject();
var expid = (IDictionary<string, object>)exp;
Random rnd = new …Run Code Online (Sandbox Code Playgroud) 也许这是一个愚蠢的问题,但我正在开发一个项目,希望我生成一些看起来像这样的JSON:
{'action.type':'post', 'application':APP_ID}
Run Code Online (Sandbox Code Playgroud)
在C#中,我正在尝试创建这个"action.type"属性,其值为"post".我该怎么办?以下是我通常会创建以下内容的方法:
dynamic ActionSpec = new ExpandoObject();
ActionSpec.SomeParam = "something";
ActionSpec.id = 12345;
Run Code Online (Sandbox Code Playgroud)
我不能去"ActionSpec.action.type",因为它不会输出所需的"action.type".这有意义吗?谢谢!
我有一个DynamicObject,我希望它可以转换为IDictionary,完全相同的方式ExpandoObject.例如,将ExpandoObject强制转换为IDictionary是完全有效的:
dynamic ex = new ExpandoObject ();
ex.Field = "Foobar";
IDictionary<string, object> dict = ex as IDictionary<string, object>;
Console.WriteLine (dict["Field"]);
Run Code Online (Sandbox Code Playgroud)
现在我尝试将它实现到我自己的DynamicObject中:
public class MyDynamicObject : DynamicObject
{
public Dictionary<string, object> members = new Dictionary<string, object> ();
public override bool TryGetMember (GetMemberBinder binder, out object result)
{
if (members.ContainsKey (binder.Name)) {
result = members[binder.Name];
return true;
}
else {
result = null;
return false;
}
}
public override bool TrySetMember (SetMemberBinder binder, object value)
{
this.members.Add (binder.Name, …Run Code Online (Sandbox Code Playgroud) 随着dynamic我们非常有动感指针,但不完全是一个动态对象.C#中真正的动态对象是ExpandoObject,但对于大多数人来说,这是一个非常未知的类.expando允许在运行时创建和删除成员,就像哈希(类似于JavaScript).
为什么ExpandoObject的优点是在一个单独的类中实现的,而不仅仅是,作为匿名类型的一个特性实现?
也许这不是一个好的举动,因为缺乏类型安全?或者可能是由于涉及(DLR)开销?
我是新的 ExpandoObject(确实,我昨天才知道)。我有以下代码,想知道是否有某种方法可以将 ExpandoObject 转换为我不知道的 DataTable?或者我必须使用反射来自己转换它?
dynamic contacts = new List<dynamic>();
contacts.Add(new ExpandoObject());
contacts[0].Name = "Patrick Hines";
contacts[0].Phone = "206-555-0144";
contacts.Add(new ExpandoObject());
contacts[1].Name = "Ellen Adams";
contacts[1].Phone = "206-555-0155";
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个通用实用程序,以从.NET外部通过COM使用(/跳过长篇故事)。无论如何,我试图将属性添加到ExpandoObject,并且我需要获取PropertyInfo结构以传递给另一个例程。
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
using System.Reflection;
public class ExpandoTest
{
public string testThis(string cVariable)
{
string cOut = "";
ExpandoObject oRec = new ExpandoObject { };
IDictionary<string, object> oDict = (IDictionary<string, object>)oRec;
oDict.Add(cVariable, "Test");
Trace.WriteLine(cVariable);
Trace.WriteLine(oDict[cVariable]);
PropertyInfo thisProp = oRec.GetType().GetProperty(cVariable);
if (thisProp != null)
{
cOut= "Got a property :)";
}
return cOut;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我总是在thisProp中获得null?我显然不明白,但我一直盯着它看了一天,却一无所获。感谢所有的帮助/批评!
我正在尝试创建一些动态的ExpandoObject。我遇到了一个问题。
由于我不知道对象中这些不同属性的名称是什么,所以我不能这样:
var list = new ArrayList();
var obj = new ExpandoObject();
obj.ID = 1,
obj.Product = "Pie",
obj.Days = 1,
obj.QTY = 65
list.Add(obj);
Run Code Online (Sandbox Code Playgroud)
让我解释一下我的情况:我希望从随机数据库中获取数据(我不知道该数据,而是根据从UI中获得的信息构建一个连接字符串),因此我不知道我需要获取哪些数据。这可能是数据库表的示例
表销售
这可能是另一个例子:
桌上足球吧
如您所见,我不知道数据库是什么样的(这是100%匿名的,因此它必须是100%动态的),并且我要返回的数据应该看起来像一个构造良好的JSON,如下所示:
[
{
"ID": 1,
"Product": "Pie"
"Days": 1,
"QTY": 65
},
{
"ID": 2,
"Product": "Melons"
"Days": 5,
"QTY": 12
}
]
Run Code Online (Sandbox Code Playgroud)
或者,使用另一个示例:
[
{
"ID": 1,
"Days": 2,
"QTY": 56,
"Product_Id": 5,
"Department_Id": 2
}
{
"ID": 2, …Run Code Online (Sandbox Code Playgroud) 我正在使用Jint在Xamarin应用程序中执行JavaScript.Jint正在将关联数组转换为ExpandoObject.我该如何使用这个对象?理想情况下,我想从中获取数据字典.
JavaScript返回:
return {blah:abc, bleh:xyz};
Run Code Online (Sandbox Code Playgroud)
Jint返回的Object调试器如下所示:
在我的ASP的.NET Web API应用,同时使DB调用,需要一些属性被添加到模型类已经有一些现有的属性.
我明白我可以使用ExpandoObject在这种情况下,并在运行时添加的属性,但我想知道如何首先从现有的对象继承所有的属性,然后添加一些.
例如,假设传递给方法的对象ConstituentNameInput被定义为
public class ConstituentNameInput
{
public string RequestType { get; set; }
public Int32 MasterID { get; set; }
public string UserName { get; set; }
public string ConstType { get; set; }
public string Notes { get; set; }
public int CaseNumber { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string PrefixName { …Run Code Online (Sandbox Code Playgroud) c# ×10
expandoobject ×10
dynamic ×5
dictionary ×2
.net ×1
casting ×1
converter ×1
datatable ×1
interface ×1
javascript ×1
json ×1
structure ×1