C# 了解'的使用;属性';
我试图更好地理解C# 了解'的使用;属性';,c#,reflection,.net-attributes,C#,Reflection,.net Attributes,我试图更好地理解属性的用法。 我明白: 如何访问“我的代码”中的属性 如何创建 如何显式指定 现在,我想对属性和好奇做更多的了解: 预定义属性(例如DllImportAttribute或STAThread)如何执行这些功能?因为我们只使用这些属性,并执行相应的功能。e、 g.在DllImportAttribute的帮助下,我只声明我的方法abc()需要xyz.dll,并加载相应的dll。我没有编写代码来搜索和加载DLLxyz.DLL .NET运行时环境或编译器是否为预定义属性提供了特殊处理
属性的用法。
我明白:
- 如何访问“我的代码”中的属性
- 如何创建
- 如何显式指定
现在,我想对属性和好奇做更多的了解:
- 预定义属性(例如
DllImportAttribute
或STAThread
)如何执行这些功能?因为我们只使用这些属性,并执行相应的功能。e、 g.在DllImportAttribute
的帮助下,我只声明我的方法abc()
需要xyz.dll
,并加载相应的dll。我没有编写代码来搜索和加载DLLxyz.DLL
- .NET运行时环境或编译器是否为预定义属性提供了特殊处理?这里我所说的特殊处理是指,.NET运行时环境或编译器是否检测到代码中使用了一些预定义的属性并运行相应的方法
- 如果是这样的话,我如何使用.NET运行时环境或编译器(即使仅在本地PC上)提供/添加此类信息,以便在任何项目中使用我的用户定义属性时,它都能运行特殊方法
真的没有什么神秘
属性实际上是与以下任何元素关联的对象:
程序集
、类
、方法
、委托
、枚举
、事件
、字段
、接口
、属性
和结构
它们可用于关联声明性信息,并通过使用反射(在运行时)检索此类信息。换句话说,您可以使用属性向程序集注入附加信息,如果需要,可以使用反射在运行时查询这些信息
属性基本上只包含其名称和可选的参数列表
来自MSDN
属性提供了一种强大的关联元数据的方法,或者
声明性信息,带有代码(程序集、类型、方法、,
属性等)。在属性与
程序实体,可以在运行时使用
这种技术叫做反射。有关详细信息,请参见反射
(C)
属性具有以下属性:
- 属性将元数据添加到程序中。元数据是关于程序中定义的类型的信息。所有.NET程序集都包含一个
描述类型和类型成员的指定元数据集
在程序集中定义。您可以添加自定义属性以指定任何
所需的其他信息。有关详细信息,请参阅,
创建自定义属性(C#)
- 可以将一个或多个属性应用于整个程序集、模块或较小的程序元素(如类和属性)
- 属性可以采用与方法和属性相同的方式接受参数
您的程序可以检查自己的元数据或其他文件中的元数据
使用反射的程序。有关详细信息,请参见访问
通过使用反射(C#)创建属性
如果希望接收有关存储在属性中的元数据的信息,则需要执行以下操作
Exmaple
从
我想知道一些属性是如何神秘地处理的?e、 g.DllImportAttribute
或STAThread
。.NET编译器是否对此类预定义属性具有特殊支持?如果是,那么是否有任何机制可以为用户定义的属性添加这样的支持?我知道我可以使用反射,如果必须使用反射,那么就明确地使用反射。但是,当为DllImportAttribute
或STAThread
等属性调用这些反射时?谁叫它。NET编译器、.NET运行时环境或其他什么?@cse是的,框架,在某个地方。实际上,你可以在微软的源代码中搜索框架代码。是的,有更多有资格的人可以说,但是它就像其他人可以使用属性一样被使用。我怀疑这会是个特例。这是我的猜测,“但是当这些反射被调用为诸如DllImportAttribute或STAThread之类的属性时”-那些被.net基础设施使用的属性,你不关心它们被调用的时间,你只关心指定它们来实现某些事情。我不懂java,也不知道你的属性有什么问题。听起来有点宽泛,而是问两个问题。听起来您想使用属性来指定要在运行方法之前/之后/在条件上运行的特定代码,对吗?Google for code contract c#。@Sinatr好的,我已经为你创建了一个单独的问题。我将为C#(代码和问题的清晰度)更新这个问题,正如我们在讨论C#.NET中@MichaelRandall对属性的响应一样。@MichaelRandall我想了解如何创建自定义属性,以便.NET运行时在代码中使用自定义属性时通知我。为了更清楚,我更新了我的问题。非直观的要求是必须有一些代码使用反射来找到属性。这些代码通常隐藏得很好。像[DllImport],内置于抖动中。[StatThread],内置于CLR中。另外,比如说,[Browsable],内置于PropertyGrid控件中,[AssemblyVersion],内置于C#编译器中。这种反射代码不能被普通人扩展。所以“运行一种特殊的方法”并不是很可能的。你可以考虑一个IL重写,PurSpar是一个这样做的产品。
[DomainName("MyTable")]
Public class MyClass : DomainBase
{}
...
public static class AttributeExtensions
{
public static TValue GetAttributeValue<TAttribute, TValue>(
this Type type,
Func<TAttribute, TValue> valueSelector)
where TAttribute : Attribute
{
var att = type.GetCustomAttributes(
typeof(TAttribute), true
).FirstOrDefault() as TAttribute;
if (att != null)
{
return valueSelector(att);
}
return default(TValue);
}
}
string name = typeof(MyClass).GetAttributeValue((DomainNameAttribute dna) => dna.Name);