objectcreator.cs

来自「语音视频功能 里面实现了基本的QQ与语音对话」· CS 代码 · 共 138 行

CS
138
字号
using System;
using System.Xml;
using System.Reflection;
using System.Diagnostics;
using System.ComponentModel;
using System.Collections;
namespace gowk.GXF
{
	/// <summary>
	/// ObjectCreator 的摘要说明。
	/// </summary>
	internal class ObjectCreator
	{
		private XmlDocument doc;
		TypeShortcutCollection types;
		XmlElementParserBaseCollecion elementParsers;
		MemberInvokerCollection memberInvokerCollection;
		static ObjectCreator creator;
		AssemblyColletion assemblys;
		public ObjectCreator()
		{
			this.types=new TypeShortcutCollection(null);
			this.elementParsers=new XmlElementParserBaseCollecion();
			this.memberInvokerCollection=new MemberInvokerCollection();

			this.InitializeMemberInvokers();
			this.InitializeParsers();
			this.InitializeShortcuts();
		}
		public TypeShortcutCollection TypeShortcuts
		{
			get{return this.types;}
		}
		internal XmlElementParserBaseCollecion XmlElementParsers
		{
			get{return this.elementParsers;}
		}
		public MemberInvokerCollection MemberInvokers
		{
			get{return this.memberInvokerCollection;}
		}
		public AssemblyColletion Assemblys
		{
			get{return this.assemblys;}
		}

		public static ObjectCreator Instance
		{
			get
			{
				if(creator==null)
				{
					creator=new ObjectCreator();
				}
				return creator;
			}
		}
		public object GetRuntimeClassInstanse(string cls)
		{
			foreach(Assembly asm in this.Assemblys)
			{
				foreach(Type t in asm.GetTypes())
				{
					if(t.Name==cls)
					{
						return System.Activator.CreateInstance(t);
					}
				}
			}
			return null;
		}
		public object CreateInstance(XmlNode node)
		{
			ParserState ps=new ParserState();
			if(node.Attributes["codebehind"]!=null)
			{
				string t=node.Attributes["codebehind"].Value;
				ps.Instance=this.GetRuntimeClassInstanse(t);
				ps.MemberInitializer=new MemberInitializer(ps.Instance);
			}
			return this.XmlElementParsers.Parse(node,ps);
		/*	foreach(XmlElementParserBase parser in this.XmlElementParsers)
			{
				System.Diagnostics.Trace.WriteLine(parser.GetType().ToString());
				if(parser.CanParse(node,ps))
				{
					try
					{
						return parser.Parse(node,ps);
					}
					catch(System.Exception ex)
					{
						System.Diagnostics.Trace.WriteLine(ex.Message);
						System.Diagnostics.Trace.WriteLine(ex.StackTrace);
					}
				}
			}
			throw(new NotSupportedException());
			return null;*/
		}

		private void InitializeShortcuts()
		{
		}
		private void InitializeParsers()
		{
			this.elementParsers.Add(new Filter());
			this.elementParsers.Add(new CollectionParser());
			this.elementParsers.Add(new MemberParser());
			this.elementParsers.Add(new DotNetTypedEelementParser());
			this.elementParsers.Add(new DotNetXmlAttributeParser());
		}
		private void InitializeMemberInvokers()
		{
			this.memberInvokerCollection.Add(new MemberInvokerForImage());
			this.memberInvokerCollection.Add(new MemberInvoker());
		}
		public XmlDocument XmlDocument
		{
			get{return this.XmlDocument;}
			set
			{
				this.doc=value;
				this.types.XmlDocument=doc;
				try
				{
					this.assemblys=new CodeParser().Parse(this.doc);
				}
				catch(System.Exception ex)
				{
					System.Windows.Forms.MessageBox.Show(ex.Message);
					System.Environment.Exit(0);
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?