Я должен построить специальное поведение класса в зависимости от аргумента конструктора. Скажем, рисунок Foo должен стать вечно зеленым, если он был построен (нарисован) зеленым карандашом.
Если какой-либо карандаш где-либо используется, Foo должен быть прозрачным ...
Теперь посмотрите на код ниже. Есть ли возможность изменить «выходные данные», чтобы конструктор «видел» реальный тип передаваемого параметра? (на самом деле все они "объект"):
class Program
{
static void Main(string[] args)
{
object[] objs = { new IndexOutOfRangeException(), MyEnum.Beta, 45, new AssemblyName(), new { Name = "a" } };
for (int i = 0; i < objs.Length; i++)
{
Console.WriteLine("{0} => {1} ", i, objs[i]);
}
Console.WriteLine("=========================== ");
for (int i = 0; i < objs.Length; i++)
{
Foo myFoo = new Foo(objs[i]);
Console.WriteLine("{0} => {1}", i, myFoo);
}
}
}
public class Foo
{
object value;
string typeName;
public Foo(object obj)
{
value = obj;
typeName = "object";
}
public Foo(MyEnum enm)
{
value = enm;
typeName = "MyEnum";
}
public Foo(int myInt)
{
value = myInt;
typeName = "int";
}
public Foo(Exception ex)
{
value = ex;
typeName = "exception";
}
public override string ToString()
{
return string.Format("FOO (object = '{0}'; type = '{1}')", value, typeName);
}
}
public enum MyEnum
{
Alpha,
Beta
}
OUTPUT
0 => System.IndexOutOfRangeException: Index was outside the bounds of the array.
1 => Beta
2 => 45
3 =>
4 => { Name = a }
===========================
0 => FOO (object = 'System.IndexOutOfRangeException: Index was outside the bound
s of the array.'; type = 'object')
1 => FOO (object = 'Beta'; type = 'object')
2 => FOO (object = '45'; type = 'object')
3 => FOO (object = ''; type = 'object')
4 => FOO (object = '{ Name = a }'; type = 'object')
EDIT:
Как видно из некоторых ответов, я хотел бы подчеркнуть, что речь идет не о правильной строке, которая должна отображаться в переменной типа, как при использовании value.GetType()
, а о "вводе" в правильном конструкторе.
Другими словами, Почему компилятор не определяет правильный тип и «перенаправляет» его в правильный конструктор?
РЕДАКТИРОВАТЬ 2:
Как отмечали ответчики, «путь» к конструктору «строится» во время компиляции, а не во время выполнения. скажи код вроде его
MyEnum en = MyEnum.Beta;
Console.WriteLine("Enum example: obj:{0} Foo:{1}", en, new Foo(en));
Выводит "хороший" вывод:
Enum example: obj:Beta Foo:FOO (object = 'Beta'; type = 'MyEnum')
так что ... по-видимому, любой способ "обойти" это поведение, кроме обнаружения времени выполнения в конструкторе, как предложено Ридом Копси ...?!