2014-11-21 5 views
1

나는 내가이 작업을 수행하려면 어떻게주어진 유형으로 어떻게 캐스팅 할 수 있습니까?

Type t = Type.GetType("fully qualified type name"); 
dynamic obj = foo as t 

의 라인을 따라 뭔가를 할 수있는 방법을 알아 내려고 노력하고있어? 나는 Convert.ChangeType()을보고 있었지만, 그것은 단지 객체를 반환하고 그것이 내가 원하는 것이 아닙니다.

+0

이 비슷한 질문이지만, 당신이 표시된 대답의 코멘트를 보면, 그것이 해결되지 않습니다 문제. 다른 사람이하려고했던 것이 무엇이든 그것을 해결했을뿐입니다. – Lunyx

+0

@Lynx, 그래, 나쁘다. 그래서 다시 열어보기로했습니다. – Habib

+0

@ 하비브, 귀하가 http://stackoverflow.com/questions/972636/casting-a-variable-using-a-type-variable을 언급하고 있다고 가정합니다. 이것은 직접적인 복제본 인 것 같습니다 ... 해당 질문이 귀하의 유스 케이스를 다루지 않는다면,보다 완벽한 예를 게시하십시오. – Mitch

답변

0

as은 컴파일 타임에 유형을 알아야하기 때문에 사용할 수 없습니다. 이미 dynamic를 사용하고 있기 때문에 왜 그냥 수행

dynamic obj = Convert.ChangeType(foo, t); 

Convert.ChangeType 메서드의 반환 형식이 object,하지만 당신은 여전히 ​​메서드와 속성을이다 사용할 수 있도록 기본 객체의 실제 타입, t 될 것입니다 동적으로

+0

'Convert.ChangeType()'은 객체의 타입을 반환하기 때문에 런타임 중에 obj가 여전히 객체의 타입으로 해석되지 않겠습니까? 이것은'object obj = Convert.ChangeType (foo, t);와 어떻게 다릅니 까? 내 이해를 위해 동적 키워드는 여전히 동일한 유형을 사용합니다. – Lunyx

+0

@Lunyx dynamic은 컴파일 시간 유형 검사 만 해제합니다. 'obj'는 두 가지 경우 모두에서 반환 된'ChangeType' 유형의 런타임에 있습니다. –

+0

@Lunyx 아니요, 그렇지 않으면'ChangeType'은 무의미합니다 (바닐라 오브젝트를 다시 얻을 수 있습니다). 객체의 _design time_ type은'object'이지만 _actual_ type은't' (반사 또는 동적 유형을 사용하여't '유형의 멤버에 도달 할 수 있음을 의미)합니다. –

4

당신이 학문을 혼합하는 것처럼 보입니다. 왜 그런지 이해하지 못합니다. 반사 또는 동적 타이핑을 사용하지만 둘 모두를 사용하면 나에게 거의 이해가되지 않습니다.

당신은 당신이 통제 유형과 일을하는 경우, 그들 인터페이스를 구현 한 :

interface IModule 
{ 
    string Name { get; } 
} 

class Module1 : IModule 
{ 
    public string Name { get { return "Module 1"; } } 
} 

public void PrintModuleName(string moduleType) 
{ 
    Type tModule = Type.GetType("MyApp.Module1"); 
    IModule module = (IModule)Activator.CreateInstance(tModule); 
    Console.WriteLine(module.Name); 
} 

당신이 제어 할 수없는 종류로 작업하는 경우, 사용 dynamic - 필요 없음 캐스트 :

class Module1 
{ 
    public string Name { get { return "Module 1"; } } 
} 

public void PrintModuleName(string moduleType) 
{ 
    Type tModule = Type.GetType("MyApp.Module1"); 
    dynamic module = Activator.CreateInstance(tModule); 
    Console.WriteLine(module.Name); 
} 

캐스팅이 필요한 유일한 경우는 대신 COM interop를 사용하거나 형식이 새 개체를 반환하는 캐스트를 구현하는 경우입니다. ,

Convert.ChangeType() 이후 반환 객체의 유형이 아닌 것 obj 여전히 런타임시 객체의 유형 해결 :


의견에 대해서는? 이 차이는 object obj = Convert.ChangeType(foo,t);과 어떻게 다른가요? 내 이해를 위해, dynamic 키워드는 여전히

정적 입력하면 코드에 액세스 할 수있는 가장 제한 유형을 지정하는 동일한 유형을 사용합니다. 예를 들어, 문 Type t = Type.GetType("foo");tSystem.Type으로 입력되었지만 런타임에 GetTypeSystem.RuntimeType의 값을 반환합니다. System.RuntimeTypeSystem.Type에서 상속되므로 문제가되지 않습니다.

마찬가지로 모든 것은 System.Object에서 상속되며 object과 같은 형식으로 저장 될 수 있습니다. 예 유용 할 수

System.Type t = Type.GetType("System.String"); 
Console.WriteLine("Runtime type of `t`:\t{0}", t.GetType().FullName); 
// Prints "Runtime type of `t` is: System.RuntimeType" 

System.String s = "foo"; 
Console.WriteLine("Runtime type of `s`:\t{0}", s.GetType().FullName); 
// Prints "Runtime type of `s` is: System.String" 

object o = s; 
Console.WriteLine("Runtime type of `o`:\t{0}", o.GetType().FullName); 
// Prints "Runtime type of `o` is: System.String" 

동적 분리형으로 존재하지 않기 때문에 반성 문법적이고.

string s = "foo"; 
Console.WriteLine("Runtime type of `s`:\t{0}", s.GetType().FullName); 

Type typeOfS = s.GetType(); 
object resultOfGetType = typeOfS.GetMethod("GetType").Invoke(s, null); 
Type typeOfResultOfGetType = resultOfGetType.GetType(); 
object resultOfFullName = typeOfResultOfGetType.GetProperty("FullName").GetValue(resultOfGetType); 

Console.WriteLine("Runtime type of `d:\t{0}", resultOfFullName); 

는 C# 그냥 컴파일 시간에이 코드 ** 모든 생성 : 그래서 :로

string s = "foo"; 
Console.WriteLine("Runtime type of `s`:\t{0}", s.GetType().FullName); 
// Prints "Runtime type of `s` is: System.String" 

dynamic d = s; 
Console.WriteLine("Runtime type of `d:\t{0}", d.GetType().FullName); 
// Also prints "Runtime type of `d` is: System.String" 

은 동일합니다.

* : 음 ... most everything
** : 음 ... not exactly this code

관련 문제