C#中的匿名类型

408 阅读1分钟

​ 在一个项目中遇到了一个关于匿名类型的坑

在C#中的匿名类型是这样创建的:

new {Id = 1, Name = "Tom", Psw = "123"};

而这些匿名类型的属性是internal的,所以是只有在同一程序集才能使用。

​ 在一个项目中我使用了dynamic去声明了一个参数,并且跨程序集调用了此方法,则会抛出异常: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException :object类中未包含Id的定义

//在一个项目添加此代码
using System;
namespace DynamicDemo {
    class Program {
        static void Main(string[] args) {
            var user = new { Id = 1, name = "Tom", psw = "123" };
            LoginInter(user);
            Demo.Demo.Login(user);
            Console.ReadKey();
        }
        public static void LoginInter(dynamic user) {
            Console.Write(user.Id + user.name + user.psw);
        }
    }
}

//在另一个项目中添加此代码  生成的程序集是Demo.dll
using System;
namespace Demo {
    public class Demo {
        public static void Login(dynamic user) {
            Console.Write(user.Id + user.name + user.psw);//抛出异常
        }
    }
}

public 关键字是类型和类型成员的访问修饰符。公共访问是允许的最高访问级别,对访问公共成员没有限制。

protected 关键字是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。

private 关键字是一个成员访问修饰符。私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结构体中才是可访问的。

internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的。