Unity3D : Attribute


A muito tempo eu descobri o poder das MetaTag no actionscript e das Annotation no Java
(falei sobre aqui -> https://fabriciodezain.wordpress.com/2013/09/30/as3metatagcustom-javaannotation/)

Agora irei colocar aqui a magica acontecendo no c# / Unity3D.
Não foi muito facil encontrar algo no iniciao, mas com a insistência o google cedeu;P
Basicamente usei como gui esses dois links:
http://www.codeproject.com/Articles/2933/Attributes-in-C
http://www.tutorialspoint.com/csharp/csharp_attributes.htm

No inicio, a coisa mais difícil de entrar na cachola foi saber que  o c# suprimiria a parte ‘Attribute’

Onde:

[AttributeUsage(AttributeTargets.All , AllowMultiple = true)]
public class CustomAttribute : Attribute
{}

Viraria

[Custom] propriedade 

e não

[CustomAttribute] propriedade

O outro pulo do gato é saber como funciona ‘reflection’ no c#…
Não e difícil, mas

'propriedade.SetValue(objeto que tem a propriedade, valor, null)'

ainda parece gambiarra pra mim =/

Então…mão na massa!

Criei uma classe para ser a minha "annotation" (passo1)
using System;
namespace Annotation
{
 [AttributeUsage(AttributeTargets.All , AllowMultiple = true)]
 public class CustomAttribute : Attribute
 {
 public string Name;
 public CustomAttribute(string __name)
 {
 this.Name = __name;
 }
 }
}
Obs.: Não use 'public' na ausência de adultos

Criar uma classe onde usaremos o nosso CustomAttribute  (passo2)
public class MyTestClass
{
 [Annotation.Custom("MyTestClass")]
 public object MySystem { set; get; }
}
Criar o cara responsável pela mágica/macumba(passo3)
using System.Reflection;
using System;
namespace Annotation
{
	public class Properties
	{

		static public void Execute(object __target)
		{
			CustomAttribute customAttribute;

			Type type =  __target.GetType();

			object[] fildList = type.GetProperties();
			foreach(PropertyInfo field in fildList)
			{
				object[] attributeList = field.GetCustomAttributes(true);
				foreach (Attribute attr in attributeList)
				{
					customAttribute = attr as CustomAttribute;
					if(customAttribute == null) { continue ;}
					var a = field;
					field.SetValue(__target,customAttribute.Name,null);
				}
			}
		}
	}
}
E por último .......Fazer o teste \o/(passo4)
using UnityEngine;
using System.Collections;

public class MyBehaviour : MonoBehaviour {

 void Start ()
 {
  MyTestClass TestInstance = new MyTestClass();
  Debug.Log(TestInstance.MySystem);
  Annotation.Properties.Execute(TestInstance);
  Debug.Log(TestInstance.MySystem);
 } 

 void Update () { }
}
Enfim, de fato, não usei a unity pra muita coisa =/ #sorry 
isso porque tem um cara que vai fazer bastante coisa pra gente
e não teremos que ficar reinventando a roda. 
https://github.com/sebas77/Lightweight-IoC-Container-for-Unity3D/blob/master/README.md

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogueiros gostam disto: