public class Value<T>
{
public Value()
{
}
public Value(T value)
{
this.value = value;
}
private T value;
}
public class Values: List<Value<T>>
Values v=new Values();
v.Add(new Value<int>());
v.Add(new Value<string>());
v.Add(new Value<MyType>());
List<object>и туда пихать всё, что угодно.
List<BaseValue>.
Copy Source | Copy HTML
-
- using System.Reflection;
-
- // создаем наши формы
- List<object> objects = new List<object>();
- objects.Add( new Form1() );
- objects.Add( new Form1() );
- objects.Add( new Form2() );
- objects.Add( new Form3() );
-
- //отображаем их
- foreach( object obj in objects )
- {
- Type t= obj .GetType();
- Type[] tIncomingParams = {};
-
- MethodInfo methodInfo = type.GetMethod( "Show", tIncomingParams );
- methodInfo.Invoke( obj, null );
- }
-
Copy Source | Copy HTML
- public interface IValue<out T>
- {
- T Get();
- }
-
- public class Value<T>:IValue<T>
- {
- public T Get()
- {
- return default(T);
- }
- }
-
- public class Values: List<IValue<object>>
- {
-
- }
Copy Source | Copy HTML
- var v = new Values();
- v.Add(new Value<string>());
- v.Add(new Value<object>());
-
- //а вот так нельзя: v.Add(new Value<int>());
-
List x = new List();
Но по сути это то же, что и список Object'ов, только ещё медленнее работающий, но не требующий явного приведения типов в коде. Учтите, что использование dynamic может нанести ущерб производительности, т.к. за ним стоит рефлекшн. Пример:
Copy Source | Copy HTML
- using System;
- using System.Collections.Generic;
- namespace Test
- {
- class Program
- {
- public static void Main(string[] args)
- {
- List<dynamic> list = new List<dynamic>();
- list.Add(1);
- list.Add("sdfsdf");
-
- foreach (dynamic item in list)
- Write(item);
-
- Console.ReadKey(true);
- }
-
- public static void Write(Int32 intValue)
- {
- Console.WriteLine("Int: " + intValue);
- }
- public static void Write(String stringValue)
- {
- Console.WriteLine("String: " + stringValue);
- }
- }
- }
protected Dictionary<Type, IExporter> Exporters { get; set; }
public void Export(object value, StreamWriter writer)
{
IExporter exporter = FindExporter(value.GetType());
if (exporter != null)
{
exporter.Export(value, writer);
}
else
{
writer.WriteString(value.ToString());
}
}
private IExporter FindExporter(Type type)
{
IExporter exporter = null;
if(Exporters.ContainsKey(type))
{
exporter = Exporters[type];
}
else
{
if(typeof(IMyFormatExportable).IsAssignableFrom(type))
{
exporter = new ExportAwareExporter(type);
}
}
return exporter;
}
public interface IMyFormatExportable
{
void Export(StreamWriter writer);
}
public MyClass : IMyFormatExportable
{
// ...
void Export(StreamWriter writer)
{
// writer.Write...(...);
}
}