我需要从.NET 4中使用dynamic关键字声明的对象中获取属性及其值的字典?似乎使用反射这是行不通的.
例:
dynamic s = new ExpandoObject();
s.Path = "/Home";
s.Name = "Home";
// How do I enumerate the Path and Name properties and get their values?
IDictionary<string, object> propertyValues = ???
Run Code Online (Sandbox Code Playgroud) 在那里,例如,类的ViewBag属性,ControllerBase我们可以动态获取/设置值并向该对象添加任意数量的附加字段或属性,这很酷.我想使用类似的东西,超出MVC应用程序和Controller其他类应用类型.当我尝试创建动态对象并设置它的属性如下所示:
1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);
Run Code Online (Sandbox Code Playgroud)
我有RuntimeBinderException消息属性或索引器'<> f__AnonymousType0.A'无法分配 - 它只在第2行读取.另外我建议它不是我正在寻找的.也许有些课程可以让我做一些像:
??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
Run Code Online (Sandbox Code Playgroud)
具有动态添加和设置属性.
我对dynamicC#的性能有疑问.我读过dynamic让编译器再次运行,但是它做了什么?
是否必须dynamic使用用作参数的变量或仅具有动态行为/上下文的行重新编译整个方法?
我注意到使用dynamic变量可以将简单的for循环减慢2个数量级.
我玩过的代码:
internal class Sum2
{
public int intSum;
}
internal class Sum
{
public dynamic DynSum;
public int intSum;
}
class Program
{
private const int ITERATIONS = 1000000;
static void Main(string[] args)
{
var stopwatch = new Stopwatch();
dynamic param = new Object();
DynamicSum(stopwatch);
SumInt(stopwatch);
SumInt(stopwatch, param);
Sum(stopwatch);
DynamicSum(stopwatch);
SumInt(stopwatch);
SumInt(stopwatch, param);
Sum(stopwatch);
Console.ReadKey();
}
private static void Sum(Stopwatch stopwatch)
{
var sum = 0;
stopwatch.Reset();
stopwatch.Start();
for …Run Code Online (Sandbox Code Playgroud) 我有一个匿名类型对象,我从一个方法接收动态,我想检查该对象上存在的属性.
....
var settings = new {
Filename="temp.txt",
Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
Run Code Online (Sandbox Code Playgroud)
我该如何实现IsSettingExist?
以下代码有一个静态方法Foo(),调用实例方法,Bar():
public sealed class Example
{
int count;
public static void Foo( dynamic x )
{
Bar(x);
}
void Bar( dynamic x )
{
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
它编译时没有错误*但在运行时生成运行时绑定程序异常.正如预期的那样,删除这些方法的动态参数会导致编译器错误.
那么为什么有一个动态参数允许编译代码?ReSharper也没有将其显示为错误.
在Visual Studio 2008中编辑1:*
编辑2:添加,sealed因为子类可能包含静态Bar(...)方法.即使是密封版本也可以在运行时调用除实例方法之外的任何方法时进行编译.
如何根据数据库查找表中的值(使用企业库数据层)自动创建枚举并随后在C#中使用其值?
例如,如果我在数据库中添加一个新的查找值,我不想在代码中手动添加额外的静态枚举值声明 - 我想让枚举与数据库保持同步.
有这样的事吗?
我不想创建代码生成的静态枚举(根据代码项目文章枚举代码生成器 - 从数据库查找表自动生成枚举代码),并希望它是完全自动的.
我想知道如何初始化一个整数数组,以便它的大小和值在我的程序执行中发生变化,任何建议?
如何构建两个正则表达式模式?
例如,我有一个长图案,一个较小,我需要在较长的图案前面放一个较小的图案.
var pattern1 = ':\(|:=\(|:-\(';
var pattern2 = ':\(|:=\(|:-\(|:\(|:=\(|:-\('
str.match('/'+pattern1+'|'+pattern2+'/gi');
Run Code Online (Sandbox Code Playgroud)
这不起作用.当我连接字符串时,所有斜杠都消失了.
我在命名空间中有几个静态类,mySolution.Macros例如
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何在反射的帮助下调用这些方法?
如果方法不是静态的那么我可以做类似的事情:
var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") );
foreach (var tempClass in macroClasses)
{
var curInsance = Activator.CreateInstance(tempClass);
// I know have an instance of a macro and will be able to run it
// using reflection I will be able to run the method as:
curInsance.GetType().GetMethod("Run").Invoke(curInsance, null);
}
Run Code Online (Sandbox Code Playgroud)
我想让我的课程保持静态.我怎么能用静态方法做类似的事情?
简而言之,我想从命名空间mySolution.Macros中的所有静态类调用所有Run方法.
我正在调用一个Web服务,它返回JSON中的对象数组.我想获取这些对象并使用HTML填充div.假设每个对象都包含一个url和一个名称.
如果我想为每个对象生成以下HTML:
<div><img src="the url" />the name</div>
Run Code Online (Sandbox Code Playgroud)
这是最好的做法吗?我可以看到几种方法: