Pertanyaan .NET Reflection - Cara mendapatkan jenis "nyata" dari ParameterInfo


Saya mencoba untuk memvalidasi bahwa parameter adalah parameter keluar dan memperluas antarmuka (ICollection). Api refleksi tampaknya tidak mau memberi saya tipe parameter "asli", hanya yang memiliki "&" di akhir yang tidak akan dievaluasi dengan benar dalam pernyataan IsAssignableFrom. Saya telah menulis beberapa kode c # yang berfungsi tetapi sepertinya harus ada cara yang lebih baik untuk melakukan ini.

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;
}

Apakah ada cara untuk mendapatkan realType tanpa reload Type dari nama stringnya? Saya masih menggunakan .NET 2.1.

Terima kasih, Randy


18
2018-04-10 17:19


asal


Jawaban:


Sebuah out parameter adalah "oleh ref" - sehingga Anda akan menemukan pInfo.ParameterType.IsByRef mengembalikan nilai true. Untuk mendapatkan jenis not-by-ref yang mendasari, hubungi GetElementType():

Type realType = pInfo.ParameterType.GetElementType();

(Kamu seharusnya hanya melakukan itu jika itu aku s oleh ref, tentu saja. Ini berlaku untuk ref parameter juga.)


23
2018-04-10 17:28



Apakah pInfo.ParameterType bukan tipe yang Anda cari?

Menurut dokumen, properti ParamterType dari kelas PropertyInfo adalah: "Objek Tipe yang mewakili Jenis parameter ini."

Juga, kode berikut memberikan hasil yang diharapkan:

    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);

Edit: Seperti yang ditunjukkan oleh John Skeet, jika parameternya adalah dengan ref; Anda harus menggunakan GetElementType untuk mendapatkan jenis yang benar. Saya memperbarui contoh kode.


5
2018-04-10 17:23



Anda juga bisa menggunakan

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

jika ParameterType.GetElementType() tidak berfungsi


0
2017-12-01 07:13



Lihat ini:

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);
}

0
2018-03-29 02:44