private static void InitAccessLevel(DomainProperty property) { if (property.IsExtensions) { var method = ExtendedClassAttribute.GetPropertyMethod(property.OwnerType, property.Name); property.AccessLevelGet = GetAccessLevel(method.Get); property.AccessLevelSet = GetAccessLevel(method.Set); } else { var pi = property.PropertyInfo; if (property.IsDynamic) { //动态属性的访问是公开的 property.AccessLevelGet = PropertyAccessLevel.Public; property.AccessLevelSet = PropertyAccessLevel.Public; } else { property.AccessLevelGet = GetAccessLevel(pi.GetMethod); property.AccessLevelSet = GetAccessLevel(pi.SetMethod); } } }
/// <summary> /// <para>初始化与领域对象相关的行为,由于许多行为是第一次使用对象的时候才触发,这样会导致没有使用对象却需要一些额外特性的时候缺少数据</para> /// <para>所以我们需要在使用领域驱动的之前执行初始化操作</para> /// </summary> internal static void Initialize() { if (_initialized) { return; } _initialized = true; //以下代码执行顺序不能变 TypeIndex = GetTypeIndex(); //指定动态类型的定义 RemoteType.Initialize(); //执行远程能力特性的初始化,收集相关数据 RemotableAttribute.Initialize(); //触发没有派生类的领域对象的静态构造 foreach (var objectType in TypeIndex) { if (DerivedClassAttribute.IsDerived(objectType)) { continue; //不执行派生类的 } DomainObject.StaticConstructor(objectType); } //先执行派生类的 DerivedClassAttribute.Initialize(); //再执行扩展的 ExtendedClassAttribute.Initialize(); }
//public static void CheckObjectExtension(Type type) //{ // if(!IsObjectExtension(type)) //} /// <summary> /// 从扩展类上获取对象的属性方法定义,扩展类中表示属性的获取和设置用的方法是GetXXX,SetXXX,XXX是属性名称,这是我们的约定 /// </summary> /// <param name="objectType"></param> /// <param name="propertyName"></param> /// <returns></returns> public static MethodTuple GetPropertyMethod(Type objectType, string propertyName) { var extensionTypes = ExtendedClassAttribute.GetExtensionTypes(objectType); foreach (var extensionType in extensionTypes) { //以下代码的意思是, var getMethod = extensionType.ResolveMethod(string.Format("Get{0}", propertyName)); var setMethod = extensionType.ResolveMethod(string.Format("Set{0}", propertyName)); if (getMethod == null && setMethod == null) { continue; } return(new MethodTuple(getMethod, setMethod)); } return(MethodTuple.Empty); }
/// <summary> /// 获取领域属性定义的特性,这些特性可以标记在对象属性上,也可以标记在静态的领域属性字段上 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="objectType"></param> /// <param name="propertyName"></param> /// <returns></returns> internal static IEnumerable <T> GetAttributes <T>(Type objectType, string propertyName) where T : Attribute { List <T> result = new List <T>(); //在对象属性定义上查找特性 result.AddRange(GetAttributesFromObjectProperty <T>(objectType, propertyName)); //从对象内部定义的领域属性上查找 result.AddRange(GetAttributesFromDomainProperty <T>(objectType, propertyName)); //从扩展对象的领域属性上查找 var extensionTypes = ExtendedClassAttribute.GetExtensionTypes(objectType); foreach (var extensionType in extensionTypes) { result.AddRange(GetAttributesFromDomainProperty <T>(extensionType, propertyName)); } return(result); }
protected MethodInfo GetMethod() { return(ExtendedClassAttribute.IsObjectExtension(this.ObjectOrExtensionType) ? GetMethodFromObjectExtension() : GetMethodFromObject()); }