//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
/*
*/
namespace System.ComponentModel {
using Microsoft.Win32;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Runtime.Remoting;
using System.Runtime.Serialization.Formatters;
using System.Security.Permissions;
///
/// Provides a type converter to convert
/// objects to and from various other representations.
///
[HostProtection(SharedState = true)]
public class ArrayConverter : CollectionConverter
{
///
/// Converts the given value object to the specified destination type.
///
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
if (destinationType == null) {
throw new ArgumentNullException("destinationType");
}
if (destinationType == typeof(string)) {
if (value is Array) {
return SR.GetString(SR.ArrayConverterText, value.GetType().Name);
}
}
return base.ConvertTo(context, culture, value, destinationType);
}
///
/// Gets a collection of properties for the type of array
/// specified by the value
/// parameter.
///
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) {
PropertyDescriptor[] props = null;
if (value.GetType().IsArray) {
Array valueArray = (Array)value;
int length = valueArray.GetLength(0);
props = new PropertyDescriptor[length];
Type arrayType = value.GetType();
Type elementType = arrayType.GetElementType();
for (int i = 0; i < length; i++) {
props[i] = new ArrayPropertyDescriptor(arrayType, elementType, i);
}
}
return new PropertyDescriptorCollection(props);
}
///
/// Gets a value indicating whether this object
/// supports properties.
///
public override bool GetPropertiesSupported(ITypeDescriptorContext context) {
return true;
}
private class ArrayPropertyDescriptor : SimplePropertyDescriptor {
private int index;
public ArrayPropertyDescriptor(Type arrayType, Type elementType, int index) : base(arrayType, "[" + index + "]", elementType, null) {
this.index = index;
}
public override object GetValue(object instance) {
if (instance is Array) {
Array array = (Array)instance;
if (array.GetLength(0) > index) {
return array.GetValue(index);
}
}
return null;
}
public override void SetValue(object instance, object value) {
if (instance is Array) {
Array array = (Array)instance;
if (array.GetLength(0) > index) {
array.SetValue(value, index);
}
OnValueChanged(instance, EventArgs.Empty);
}
}
}
}
}