博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity中使用Attribute
阅读量:5066 次
发布时间:2019-06-12

本文共 3843 字,大约阅读时间需要 12 分钟。

Attribute是c#的语言特性

msdn说明如下:

The Attribute class associates predefined system information or user-defined custom information with a target element. A target element can be an assembly, class, constructor, delegate, enum, event field,interface, method, portable executable file module, parameter, property, return value, struct, or another attribute.

Information provided by an attribute is also known as metadata. Metadata can be examined at run time by your application to control how your program processes data, or before run time by external tools to control how your application itself is processed or maintained. For example, the .NET Framework predefines and uses attribute types to control run-time behavior, and some programming languages use attribute types to represent language features not directly supported by the .NET Framework common type system.

All attribute types derive directly or indirectly from the Attribute class. Attributes can be applied to any target element; multiple attributes can be applied to the same target element; and attributes can be inherited by an element derived from a target element. Use the AttributeTargets class to specify the target element to which the attribute is applied.

The Attribute class provides convenient methods to retrieve and test custom attributes. For more information about using attributes, see Applying Attributes and Extending Metadata Using Attributes.

简单翻译如下:

Attribute类可以把目标元素和一个预定义的信息或者是用户自定义信息关联起来。这里的目标元素可以是assembly,class,constructor,delegate,enum,event,field,interface,method,可执行文件模块,parameter,property,return value,struct或其它的Attribute。

Attribute提供的信息也被称为元数据(metadata)。元数据能用于在运行时控制怎样访问你的程序数据,或者在运行前通过额外的工具来控制怎样处理你的程序或部署它。例如.NET Framework预定义并使用attribute去控制运行时行为,一些编程语言使用attribute类型来描述.NET Framework中通用类型不直接支持的语言特性。
所有的Attribute类型直接或间接从Attribute类继承。Attribute能应用到任何target元素;多个Attribute能应用到相同的元素;
Attribute类提供遍历的方法去取出和测试自定义Attribute。更多关于Attribute的信息,可以看Applying Attributes和Extending Metadata Using Attributes。

unity中的预定义attribute

看了上述说明,我们可能还不是很清楚attribute到底怎么用,我们先来看看Unity中常用的预定义attribute是怎么使用的,然后再学习怎么使用我们自己自定义的attribute。

DllImport

DllImport应用于方法,用于告诉运行时该方法位于指定的dll的非托管代码中(如c/c++,oc等),如果dll是托管代码生成的(如c#代码生成的dll),则不需要应用此特性。例如,当我们需要调用iOS中的浏览器打开一个url时,可以先编写oc的方法,然后放在项目的plugin目录中,并且在c#脚本中应用DllImport就可以调用了。

oc代码:

NSString* CreateNSString (const char* string){    if (string)        return [NSString stringWithUTF8String: string];    else        return [NSString stringWithUTF8String: ""];}extern "C" {    void OpenUrl(const char* urlString)    {          //打开浏览器        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:CreateNSString(urlString)]];         return;     } }

c#代码:

[DllImport("__Internal")]public static extern string OpenUrl(string url);

其他unity预定义attribute的使用可以参考

使用自定义的attribute

自定义的attribute需要继承System.Attribute,然后我们可以使用c#的预定义特性去注明此attribute的应用范围。如果我们自定义的attribute名为UI,那么我们的自定义的attribute类名则应该为UIAttribute。

using System;

public enum UILayer

{
    Default,
    Secondary,
    Popup,
    TipAndWraning
}

[AttributeUsage(AttributeTargets.Class)]
public class UIAttribute : Attribute
{
  
public UILayer Layer { get; set; }
}

如上所示,我们定义了一个attribute,UI,并且指明了应用范围只能在类上应用。我们用这个attribute来注明不同的View类的Layer属性,使用代码如下:

[UI(Layer = UILayer.Default)]public class LoginView : View{    //略}
[UI(Layer = UILayer.Popup)]public class AlertInfoView : View{    //略}

当我们创建不同View类的实例时,可以从attribute中获取到Layer信息:

public View CreateView(System.Type type)    {        UIAttribute classAttribute = (UIAttribute)System.Attribute.GetCustomAttribute(type, typeof(UIAttribute));               View view = System.Activator.CreateInstance(type) as View;        view.Layer = classAttribute.Layer;               return view;    }public void Test(){    View login = CreateView(typeof(LoginView));    View alert = CreateView(typeof(AlertInfoView));}

转载于:https://www.cnblogs.com/alan777/p/6139802.html

你可能感兴趣的文章
模板统计LA 4670 Dominating Patterns
查看>>
泛型第23条:请不要在新代码中使用原生态类型
查看>>
团队项目开发客户端——登录子系统的设计
查看>>
【AppScan心得】IBM Rational AppScan 无法记录登录序列
查看>>
[翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
查看>>
简化通知中心的使用
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
html 简介
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
选择器
查看>>
Mysql与Oracle 的对比
查看>>
idea的maven项目无法引入junit
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>
fur168.com 改成5917电影
查看>>
PHP上传RAR压缩包并解压目录
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>