2014-04-15 12 views
-8

값이 유형 t 인 참조를 나타내는 값이 있습니다.C# System.Double & to System.Double

: System.Double & 또는 System.Double은 [] &은 ... 는 지금은 유형 System.Double 또는 System.Double [], ...

질문 편집과 개체의 인스턴스를 만들고 싶습니다

 Type t = param.ParameterType; 
     if (t == Type.GetType("System.String&")) 
      return Activator.CreateInstance(Type.GetType("System.String"), new object[] { new char[] { ' ' } }); 
     if (t == Type.GetType("System.Double[]&")) 
      return Activator.CreateInstance(Type.GetType("System.Dobule[]"), new object[] { 10 }); // throw Error !!!! 
     else 
      return Activator.CreateInstance(t.GetElementType()); 

편집 2 : 나는 이런 식으로 뭔가를 구현하고자 :

Type t = param.ParameterType; 
if t is a reference to an array of any dimensions -> create its instance 
if t is a ref to string -> create its instance 
if t is a ref to any other data types -> create its instance 
+0

'System.Double &'및'System.Double && '란 무엇입니까? o.O –

+0

C#에 대해 이야기하고 있습니까? – Baldrick

+0

이것에 대해 더 자세히 설명해 주시겠습니까? –

답변

1

& 아마 유형의 CLR 이름에서 오는 앰퍼샌드. 형식이 ByRef 인 것을 나타냅니다. ref 또는 out 키워드로 장식 된 메서드 매개 변수를 반영하여 Type을 얻었습니까?

예 :

ref 키워드 예를 들어
var t1 = typeof(double); 
Console.WriteLine(t1);  // "System.Double" 
var t2 = t1.MakeByRefType(); 
Console.WriteLine(t2);  // "System.Double&" 
var t3 = t2.GetElementType(); 
Console.WriteLine(t3);  // "System.Double" 

Console.WriteLine(t1 == t3); // "True" 

, 당신은 (유형 Program 내부)하는 방법이 있다고 가정 다음과 같습니다

다음
public static bool TestMethod(ref double d) 
{ 
    return true; 
} 

당신은 할 수 있습니다 :

var t4 = typeof(Program).GetMethod("TestMethod").GetParameters()[0].ParameterType; 
Console.WriteLine(t4);  // "System.Double&" 

다시 말씀 드리면 &GetElementType()입니다.

배열 유형과 동일하게 ByRef 일 수도 있고 그렇지 않을 수도 있습니다.


추가 후 편집 : 대신

예를 들어, Type.GetType("System.String[]")typeof(string[])을 강력히 추천합니다. C# 키워드 typeof을 사용하는 것이 훨씬 안전합니다. 마지막으로

Type t = param.ParameterType; 
if (t.IsByRef) 
    t = t.GetElementType(); 

, 당신은 실행을 얻을 이유를 : 당신이 존재하는 경우, 당신이 말할 수 있습니다 "하는 ByRef"제거하려면

어떤 "후행 앰퍼샌드"제거하려면

, 즉 - 시간 예외는 Dobule의 철자가 틀린 것 같습니다. typeof(double) (컴파일시 맞춤법 검사)으로 문제가 발생하지 않았을 것입니다.

그리고 말을 훨씬 더 쉽게입니다 : 대신의

return " "; 

:

return Activator.CreateInstance(Type.GetType("System.String"), new object[] { new char[] { ' ' } }); 

을하고 말 : 대신의

return new double[10]; 

:

return Activator.CreateInstance(Type.GetType("System.Double[]"), new object[] { 10 }); // spelling error fixed 

모든 것을 간접적으로 만드는 이유는 무엇입니까?

+0

Jeppe 감사합니다. 실제로 작동한다. 그럼에도 불구하고 예를 들어 문제를 만들 수 있습니다. System.Double [] &. 나는뿐만 아니라 그것을 해결하려고 System.String &하지만 작동하지 않습니다. 원본 질문에 추가 한 코드 스 니펫을 참조하십시오. – charlie87

+0

@ charlie87 "answer"확장. –

+0

다시 한번 감사드립니다. 그것은 작동하고 나를 이해하는 데 도움이됩니다. Activator.CreatInstance를 사용한 이유는 일반적으로 배열을 구현할 때 매개 변수가없는 생성자로 인해 가능하지 않기 때문입니다. 모든 유형의 배열에 대한 일반 코드를 구현할 수 있습니까 ??? – charlie87