public DataConverterAttribute(Type dataConverter, Type storageType)
        {
            if (dataConverter == null)
            {
                throw new ArgumentNullException("dataConverter", "A converter must be specified.");
            }

            if (storageType == null)
            {
                throw new ArgumentNullException("storageType", "A storage type must be specified.");
            }

            if (!dataConverter.GetImplementedInterfaces().Contains(typeof(IDataConverter)))
            {
                throw new ArgumentException("The converter must inherit from IDataConverter.", "dataConverter");
            }

            var constructors = dataConverter.GetDeclaredConstructors();
            if (constructors.All(x => !x.IsPublic || x.GetParameters().Length != 0))
            {
                throw new ArgumentException("The converter must have a public parameterless constructor.",
                                            "dataConverter");
            }

            StorageType = storageType;
            DataConverter = dataConverter;
            Parameter = null;
        }
示例#2
0
 public TypeInfo(Type type, IEnumerable<MethodInfo> sourceExtensionMethodSearch)
 {
     Type = type;
     var publicReadableMembers = GetAllPublicReadableMembers();
     var publicWritableMembers = GetAllPublicWritableMembers();
     PublicReadAccessors = BuildPublicReadAccessors(publicReadableMembers);
     PublicWriteAccessors = BuildPublicAccessors(publicWritableMembers);
     PublicNoArgMethods = BuildPublicNoArgMethods();
     Constructors = type.GetDeclaredConstructors().Where(ci => !ci.IsStatic).ToArray();
     PublicNoArgExtensionMethods = BuildPublicNoArgExtensionMethods(sourceExtensionMethodSearch);
 }
示例#3
0
 public TypeDetails(Type type, Func<PropertyInfo, bool> shouldMapProperty, Func<FieldInfo, bool> shouldMapField, IEnumerable<MethodInfo> sourceExtensionMethodSearch)
 {
     Type = type;
     var membersToMap = MembersToMap(shouldMapProperty, shouldMapField);
     var publicReadableMembers = GetAllPublicReadableMembers(membersToMap);
     var publicWritableMembers = GetAllPublicWritableMembers(membersToMap);
     PublicReadAccessors = BuildPublicReadAccessors(publicReadableMembers);
     PublicWriteAccessors = BuildPublicAccessors(publicWritableMembers);
     PublicNoArgMethods = BuildPublicNoArgMethods();
     Constructors = type.GetDeclaredConstructors().Where(ci => !ci.IsStatic).ToArray();
     PublicNoArgExtensionMethods = BuildPublicNoArgExtensionMethods(sourceExtensionMethodSearch);
 }
示例#4
0
 public TypeDetails(Type type, IProfileConfiguration config)
 {
     Type = type;
     var membersToMap = MembersToMap(config.ShouldMapProperty, config.ShouldMapField);
     var publicReadableMembers = GetAllPublicReadableMembers(membersToMap);
     var publicWritableMembers = GetAllPublicWritableMembers(membersToMap);
     PublicReadAccessors = BuildPublicReadAccessors(publicReadableMembers);
     PublicWriteAccessors = BuildPublicAccessors(publicWritableMembers);
     PublicNoArgMethods = BuildPublicNoArgMethods();
     Constructors = type.GetDeclaredConstructors().Where(ci => !ci.IsStatic).ToArray();
     PublicNoArgExtensionMethods = BuildPublicNoArgExtensionMethods(config.SourceExtensionMethods);
 }
示例#5
0
 public TypeDetails(Type type, ProfileMap config)
 {
     Type = type;
     var membersToMap = MembersToMap(config.ShouldMapProperty, config.ShouldMapField);
     var publicReadableMembers = GetAllPublicReadableMembers(membersToMap);
     var publicWritableMembers = GetAllPublicWritableMembers(membersToMap);
     PublicReadAccessors = BuildPublicReadAccessors(publicReadableMembers);
     PublicWriteAccessors = BuildPublicAccessors(publicWritableMembers);
     PublicNoArgMethods = BuildPublicNoArgMethods();
     Constructors = type.GetDeclaredConstructors().Where(ci => !ci.IsStatic).ToArray();
     PublicNoArgExtensionMethods = BuildPublicNoArgExtensionMethods(config.SourceExtensionMethods);
     AllMembers = PublicReadAccessors.Concat(PublicNoArgMethods).Concat(PublicNoArgExtensionMethods).ToList();
     DestinationMemberNames = AllMembers.Select(mi => new DestinationMemberName { Member = mi, Possibles = PossibleNames(mi.Name, config.Prefixes, config.Postfixes).ToArray() });
 }
示例#6
0
        public LateBoundCtor CreateCtor(Type type)
        {
            var ctor = _ctorCache.GetOrAdd(type, t =>
            {
                //handle valuetypes
                if (!type.IsClass())
                {
                    var ctorExpression =
                        Expression.Lambda<LateBoundCtor>(Expression.Convert(Expression.New(type), typeof (object)));
                    return ctorExpression.Compile();
                }
                else
                {
                    var constructors = type
                        .GetDeclaredConstructors()
                        .Where(ci => !ci.IsStatic);

                    //find a ctor with only optional args
                    var ctorWithOptionalArgs = constructors.FirstOrDefault(c => c.GetParameters().All(p => p.IsOptional));
                    if (ctorWithOptionalArgs == null)
                        throw new ArgumentException(
                            "Type needs to have a constructor with 0 args or only optional args", "type");

                    //get all optional default values
                    var args = ctorWithOptionalArgs
                        .GetParameters()
                        .Select(p => Expression.Constant(p.DefaultValue, p.ParameterType)).ToArray();

                    //create the ctor expression
                    var ctorExpression =
                        Expression.Lambda<LateBoundCtor>(Expression.Convert(Expression.New(ctorWithOptionalArgs, args),
                            typeof (object)));
                    return ctorExpression.Compile();
                }
            });

            return ctor;
        }
示例#7
0
文件: RubyClass.cs 项目: kashano/main
 private ConstructorInfo GetConstructor(Type/*!*/ type, params Type[]/*!*/ parameterTypes) {
     return type.GetDeclaredConstructors()
         .WithBindingFlags(BindingFlags.Instance | BindingFlags.Public | (Context.DomainManager.Configuration.PrivateBinding ? BindingFlags.NonPublic : 0))
         .WithSignature(parameterTypes)
         .FirstOrDefault();
 }
示例#8
0
文件: RubyClass.cs 项目: kashano/main
 private IEnumerable<ReflectionOverloadInfo>/*!*/ GetConstructors(Type/*!*/ type) {
     return 
         from ctor in type.GetDeclaredConstructors()
         where !ctor.IsStatic && (Context.DomainManager.Configuration.PrivateBinding || ctor.IsPublic)
         select new ReflectionOverloadInfo(ctor);
 }
示例#9
0
文件: Marshal.cs 项目: TerabyteX/main
            /*!*/
            public static object CreateRange(RubyClass theClass, Type baseType, IDictionary<string, object> attributes = null)
            {
                object begin = null, end = null, excludeEnd = null;

                BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
                ConstructorInfo ci = null;

                if (attributes != null) {
                    if (attributes.TryGetValue("begin", out begin))
                        attributes.Remove("begin");

                    if(attributes.TryGetValue("end", out end))
                        attributes.Remove("end");

                    if(attributes.TryGetValue("excl", out excludeEnd))
                        attributes.Remove("excl");

                    if (begin is int && end is int && IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(_ccRangeTypes1).SingleOrDefault())) {
                        return ci.Invoke(new object[] { begin, end, true.Equals(excludeEnd) });
                    } else if (begin is int && end is int && IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(_ccRangeSubclassTypes1).SingleOrDefault())) {
                        return ci.Invoke(new object[] { theClass, begin, end, true.Equals(excludeEnd) });
                    } else if (begin is MutableString && end is MutableString && IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(_ccRangeTypes2).SingleOrDefault())) {
                        return ci.Invoke(new object[] { begin, end, true.Equals(excludeEnd) });
                    } else if (begin is int && end is int && IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(_ccRangeSubclassTypes2).SingleOrDefault())) {
                        return ci.Invoke(new object[] { theClass, begin, end, true.Equals(excludeEnd) });
                    }
                }

                if (IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(ReflectionUtils.EmptyTypes).Single())) {
                    return ci.Invoke(new object[0]);
                }

                string message = String.Format("Class {0} does not have a valid constructor", theClass.Name);
                throw new NotSupportedException(message);
            }
示例#10
0
文件: Marshal.cs 项目: TerabyteX/main
            /*!*/
            public static object CreateException(RubyClass theClass, Type baseType, IDictionary<string, object> attributes = null)
            {
                object mesg = null, bt = null;

                BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
                ConstructorInfo ci = null;

                Exception result = null;

                if (attributes != null) {
                    if (attributes.TryGetValue("mesg", out mesg))
                        attributes.Remove("mesg");

                    if (attributes.TryGetValue("bt", out bt)) {
                        attributes.Remove("bt");
                    }

                    if(mesg is MutableString)
                        mesg = ((MutableString)mesg).ToString();
                   }

                if (mesg is string && IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(_ccExceptionTypes1).SingleOrDefault())) {
                    result = (Exception)ci.Invoke(new object[] { mesg });
                } else if (IsAvailable(ci = baseType.GetDeclaredConstructors().WithBindingFlags(bindingFlags).WithSignature(ReflectionUtils.EmptyTypes).SingleOrDefault())) {
                    result = (Exception)ci.Invoke(new object[0]);
                } else {
                    string message = String.Format("Class {0} does not have a valid constructor", theClass.Name);
                    throw new NotSupportedException(message);
                }

                if (bt is RubyArray)
                    RubyExceptionData.GetInstance(result).Backtrace = (RubyArray)bt;
                return result;
            }