相关疑难解决方法(0)

将JSON反序列化为C#动态对象?

有没有办法将JSON内容反序列化为C#4动态类型?为了使用DataContractJsonSerializer,跳过创建一堆类会很不错.

.net c# serialization json dynamic

919
推荐指数
22
解决办法
67万
查看次数

扩展方法和动态对象

我将把我的问题总结为以下代码片段.

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.为什么会这样?

c# dynamic c#-4.0

93
推荐指数
3
解决办法
2万
查看次数

在解析动态对象时,C#是否为var选择了错误的类型?

我使用以下代码将一些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)

..但似乎编译器正在做出"糟糕的猜测".任何人都可以向我解释这个吗?

谢谢

c# var dynamic c#-4.0

13
推荐指数
1
解决办法
1155
查看次数

转换动态对象并传递到UnitOfWork和Repository模式.抛出异常

这是一个非常具体的问题.不太确定如何说出来.基本上我正在实现工作单元和存储库模式,我有一个动态对象,我转换为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

7
推荐指数
1
解决办法
459
查看次数

为什么编译器推断var是动态的而不是具体的类型?

鉴于这个简短的示例程序:

    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在这种情况下是默认值?

编辑

我可能使用了比必要更复杂的例子.似乎这里提出的问题是:

使用'var'和'dynamic'时的异常

提供更简洁的示例和一些有关其工作方式的见解.

https://blogs.msdn.microsoft.com/ericlippert/2012/11/05/dynamic-contagion-part-one/

描述编译器如何处理动态.

c#

7
推荐指数
1
解决办法
171
查看次数

为什么C#编译器无法使用动态推断lambda表达式的类型?

请考虑以下代码.出于这个原因,我想弄清楚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)

c# lambda type-inference

5
推荐指数
0
解决办法
179
查看次数