생성자의 인수에 따라 특수 클래스 동작을 작성해야합니다. 녹색 연필로 건축 (그려진)했다면 푸 그림은 영원히 녹색이되어야한다고합니다. 연필을 사용하는 경우 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')
편집 : 몇 가지 답변을 참조로
것은, 내가 그 올바른에 대해 아닙니다 강조하고 싶습니다 문자열을 "type"변수에 표시하려면 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')
그래서 ...이 분명히, 어떤 방법을 "우회"이 동작하지만 생성자의 런타임 감지가 제안처럼 리드 copsey ...?!
런타임까지 유형을 알 수 없기 때문에 컴파일러에서 유형을 감지 할 수 없습니다. 따라서 올바른 cctor를 결정할 수 없습니다. –
@David Neale : 감사합니다. 내가 "우회"하는 해결 방법이 필요합니다.) – serhio
리플렉션 ('GetType()')을 사용하여 유형 이름을 가져 오는 것이 좋습니다. 당신이 런타임에 도착하면 그게 당신이 할 수있는 유일한 방법입니다. 그렇지 않으면 - 왜이 객체들을 통해 반복하고 있습니까? 그게 필요 할까? –