using System;
public interface IArgument {
Object Value { get; }
}
public interface IArgument<out TValue>
{
TValue Value { get; }
}
public static class Argument {
public static Argument<T> Create<T>(T value) {
return new Argument<T>(value);
}
public static Boolean Is<TArgumentType>(this IArgument argument) {
return argument.Value is TArgumentType;
}
}
public class Argument<TValue> : IArgument<TValue>, IArgument {
Object IArgument.Value { get { return Value; } }
public TValue Value { get; protected set; }
public Argument(TValue value) {
Value = value;
}
}
public class Test
{
public static void Main()
{
var number = Argument.Create(10);
var obj = Argument.Create(new object());
var text = Argument.Create("Hello World!");
var objText = Argument.Create<Object>("Hello World!");
var array = new IArgument[] { number, obj, text, objText };
foreach (var argument in array) {
Console.WriteLine("argument.Is<Object>(): {0}", argument.Is<Object>());
Console.WriteLine("argument is Argument<Object>: {0}", argument is Argument<Object>);
Console.WriteLine(argument.Value);
}
}
}
This solution may solve this problem (http://ideone.com/htzAWP):