X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.ComponentModel.Design.Serialization%2FInstanceDescriptor.cs;h=c3940e4757f0070bc0d69b29a623a0489e9a565a;hb=4a2ab0336e97f3591eebbb881a1471d3051946c9;hp=fc713904b6af1d32f67874b929707e6fb41af57e;hpb=52f9ed8dc05e476ba8f712ddbb1eb0a2e2bf28c1;p=mono.git diff --git a/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs b/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs index fc713904b6a..c3940e4757f 100644 --- a/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs +++ b/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs @@ -7,15 +7,36 @@ // // (C) 2003 Martin Willemoes Hansen // (C) 2003 Andreas Nahr +// Copyright (C) 2005 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Collections; using System.Reflection; +using System.Security.Permissions; + +namespace System.ComponentModel.Design.Serialization { -namespace System.ComponentModel.Design.Serialization -{ - public sealed class InstanceDescriptor - { + [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)] + public sealed class InstanceDescriptor { private MemberInfo member; private ICollection arguments; @@ -29,9 +50,7 @@ namespace System.ComponentModel.Design.Serialization public InstanceDescriptor(MemberInfo member, ICollection arguments, bool isComplete) { this.isComplete = isComplete; - if (member == null) - throw new ArgumentNullException ("member", "MemberInfo must be valid"); - if (!IsMemberValid (member, arguments)) + if ((member != null) && !IsMemberValid (member, arguments)) throw new ArgumentException ("Only Constructor, Method, Field or Property members allowed", "member"); this.member = member; this.arguments = arguments; @@ -43,8 +62,6 @@ namespace System.ComponentModel.Design.Serialization // According to docs only these types are allowed case MemberTypes.Constructor: ConstructorInfo CI = (ConstructorInfo) member; - if (!CI.IsStatic) - throw new ArgumentException ("InstanceDescriptor only describes static (VB.Net: shared) members", "member"); if (arguments == null) // null counts as no arguments if (CI.GetParameters().Length != 0) throw new ArgumentException ("Invalid number of arguments for this constructor", "arguments"); @@ -104,14 +121,36 @@ namespace System.ComponentModel.Design.Serialization get { return member; } } + private bool HasThis () + { + if (member is ConstructorInfo) + return false; + MethodInfo mi = (member as MethodInfo); + if (mi != null) + return !mi.IsStatic; + FieldInfo fi = (member as FieldInfo); + if (fi != null) + return !fi.IsStatic; + PropertyInfo pi = (member as PropertyInfo); + if (pi != null) + return !pi.GetGetMethod ().IsStatic; + return true; + } + public object Invoke() { object[] parsearguments; if (arguments == null) parsearguments = new object[0]; - else { + else if (HasThis ()) { parsearguments = new object[arguments.Count - 1]; arguments.CopyTo (parsearguments, 0); + } else { + parsearguments = (arguments as object[]); + if (parsearguments == null) { + parsearguments = new object[arguments.Count]; + arguments.CopyTo (parsearguments, 0); + } } //MemberInfo member;