有没有办法将JSON内容反序列化为C#4动态类型?为了使用DataContractJsonSerializer,跳过创建一堆类会很不错.
我将把我的问题总结为以下代码片段.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.
现在我尝试了以下内容
dynamic dList = list;
Console.WriteLine(dList.First());
Run Code Online (Sandbox Code Playgroud)
但是我得到了RuntimeBinderException.为什么会这样?
我使用以下代码将一些Json转换为动态对象.当我在动态类型的属性上使用DateTime.Parse时,我希望var猜测它的类型是DateTime ......相反,它保持动态.这不可能是对的,可以吗?
完整的例子如下.
var settings = new JavaScriptSerializer().Deserialize<dynamic>(json);
var startDate = DateTime.Parse(settings.startDate);
var endDate = DateTime.Parse(settings.endDate);
var userId = int.Parse(settings.userId);
Run Code Online (Sandbox Code Playgroud)
startDate,endDate和userId都是动态的,这意味着我不能在以后的Lambda表达式中使用它们.显然,我可以用以下代码修复代码:
DateTime startDate = DateTime.Parse(settings.startDate);
DateTime endDate = DateTime.Parse(settings.endDate);
int userId = int.Parse(settings.userId);
Run Code Online (Sandbox Code Playgroud)
..但似乎编译器正在做出"糟糕的猜测".任何人都可以向我解释这个吗?
谢谢
这是一个非常具体的问题.不太确定如何说出来.基本上我正在实现工作单元和存储库模式,我有一个动态对象,我转换为int,但如果我使用var它将在尝试调用方法时抛出异常.
我试图删除所有这些问题,我可以解决这个问题.出于某种原因,我只看到这两种设计模式.我得到的例外是Additional information: 'BlackMagic.ITacoRepo' does not contain a definition for 'DoStuff'
这是代码:
class BlackMagic
{
static void Main(string[] args)
{
dynamic obj = new ExpandoObject();
obj.I = 69;
UnitOfWork uow = new UnitOfWork();
int i1 = Convert.ToInt32(obj.I);
var i2 = Convert.ToInt32(obj.I);
if(i1.Equals(i2))
{
uow.TacoRepo.DoStuff(i1); // Works fine
uow.TacoRepo.DoStuff(i2); // Throws Exception
}
}
}
class UnitOfWork
{
public ITacoRepo TacoRepo { get; set; }
public UnitOfWork()
{
TacoRepo = new TacoRepo();
}
}
class Repo<T> : IRepo<T> …Run Code Online (Sandbox Code Playgroud) c# unit-of-work repository-pattern expandoobject dynamicobject
鉴于这个简短的示例程序:
static void Main(string[] args)
{
Console.WriteLine(Test("hello world"));
}
private static int Test(dynamic value)
{
var chars = Chars(value.ToString());
return chars.Count();
}
private static IEnumerable<char> Chars(string str)
{
return str.Distinct();
}
Run Code Online (Sandbox Code Playgroud)
运行时,它会产生类似于的异常:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''object' does not contain a definition for 'Count''
含义编译器选择dynamic作为首选类型的chars变量.
有没有理由不选择IEnumerable<char>具体类型,考虑动态不是从Chars方法返回的?只是手动更改类型以IEnumerable<char>解决问题,但我想知道为什么dynamic在这种情况下是默认值?
编辑
我可能使用了比必要更复杂的例子.似乎这里提出的问题是:
提供更简洁的示例和一些有关其工作方式的见解.
https://blogs.msdn.microsoft.com/ericlippert/2012/11/05/dynamic-contagion-part-one/
描述编译器如何处理动态.
请考虑以下代码.出于这个原因,我想弄清楚C#编译器在使用lambda表达式时无法推断该函数Map返回Aw/o显式类型规范的类型.
这种情况的文件的任何理由或参考解释了这种行为?
class Program
{
public class A
{
}
public static A Map(dynamic x)
{
return new A();
}
static void Main(string[] args)
{
IEnumerable<dynamic> d = new dynamic[] { };
// OK
IEnumerable<A> a1 = d.Select(Map);
// OK
IEnumerable<A> a2 = d.Select(x => (A)Map(x));
// NOT OK
// Cannot implicitly convert type 'IEnumerable<dynamic>' to 'IEnumerable<A>'
IEnumerable<A> a3 = d.Select(x => Map(x));
}
}
Run Code Online (Sandbox Code Playgroud)