2009-04-10 15 views
18

Bir parametrenin hem bir çıkış parametresi olduğunu hem de bir arabirimi (ICollection) genişleteceğini doğrulamaya çalışıyorum. Yansıma api, parametrenin "gerçek" türünü vermek istemiyor gibi görünmektedir, yalnızca bir "&" ile bir IsAssignableFrom deyiminde doğru olarak değerlendirilmeyecek olanı. Çalıştığım bazı C# kodları yazdım ama bunu yapmak için daha iyi bir yol olmalı..NET Yansıma - Dışarıdan "gerçek" tür nasıl alınır ParameterInfo

bool isCachedArg(ParameterInfo pInfo) 
{  
    if (!pInfo.IsOut) 
     return false; 

    string typeName = pInfo.ParameterType.FullName; 
    string nameNoAmpersand = typeName.Substring(0, typeName.Length - 1); 
    Type realType = Type.GetType(nameNoAmpersand); 

    if (!typeof(ICollection).IsAssignableFrom(realType)) 
     return false; 

    return true; 
} 

Yazım, dizeyi dize adından yeniden yüklemeden realType almanın bir yolu var mı? Hala .NET 2.1'deyim.

sayesinde Randy

cevap

23

out parametresi "ref olarak" - yani pInfo.ParameterType.IsByRef gerçek değerini döndürür. almak için altta yatan değil-by-ref tipi, çağrı GetElementType():

Type realType = pInfo.ParameterType.GetElementType(); 

(Bunu ref ise, tabii ki bu da ref parametreler için geçerlidir bunu sadece gerekmektedir.).

+0

+1 "Çıkış parametresi" ref 'ile "dir. –

+0

Kesinlikle haklısın, cevabım ref cevap olarak cevap :-) +1. – driis

+0

Harika çalışıyor. Teşekkür ederim! – randy909

5

pInfo.ParameterType Aradığınız türü değil midir?

Docs göre PropertyInfo sınıfının ParamterType özelliğidir: Ayrıca "The Type object that represents the Type of this parameter."

, aşağıdaki kod beklenen çıktıyı verir:

Type t = typeof (X); 
    var mi = t.GetMethod("Method"); 
    var parameters = mi.GetParameters(); 
    foreach(Type parameterType in parameters.Select(pi => pi.ParameterType)) 
      Console.WriteLine(parameterType.IsByRef ? parameterType.GetElementType() : parameterType); 

Düzenleme: John Skeet işaret ettiği gibi, parametre ref ise; Doğru tür almak için GetElementType kullanmalısınız. Kod örneğini güncelledim.

0

Ayrıca

0

bu Bkz çalışmıyor

Type type = Type.GetType("System."+ pInfo.ParameterType.Name); 

ParameterType.GetElementType() eğer kullanabilirsiniz:

var parameters = methodinfo.GetParameters(); 
foreach (var parameter in parameters) 
{ 
    var HasValue = ""; 
    Type ParameterType = (parameter.IsOut || parameter.ParameterType.IsByRef) ? parameter.ParameterType.GetElementType() : parameter.ParameterType; 
    if (ParameterType.GetProperties().Count() == 2 && ParameterType.GetProperties()[0].Name.Equals("HasValue")) 
    { 
     HasValue = "?"; 
     ParameterType = ParameterType.GetProperties()[1].PropertyType; 
    } 
    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
     var expr = new CodeTypeReferenceExpression(ParameterType); 
     var prov = new CSharpCodeProvider(); 
     prov.GenerateCodeFromExpression(expr, sw, new CodeGeneratorOptions()); 
    } 
    var result = string.Concat(sb.ToString(), HasValue, " ", parameter.Name); 
    Console.WriteLine(result); 
} 
İlgili konular