次の例は、特定のシナリオで Type.GetType が失敗することを示しています。
GetType は、ラムダ式でクラス名文字列 (名前空間を含む) を指定すると成功しますが、GetType の呼び出しをメソッド グループとして指定すると失敗します。
失敗:
collectionOfClassNames.Select(GetType)
成功:
collectionOfClassNames.Select(s => GetType(s))
クラスパスにアセンブリ名が含まれている場合、両方のメソッドが成功します。上記のために生成されたILを考えると、それは現在のコンテキスト/スコープと関係があると思われます。IL の違いはわかりますが、正確な原因はまだ説明できません。
以下は、問題を示す実行可能な例です。
using System;
using System.Linq;
using System.Reflection;
namespace GetTypeTest
{
public class FindMe{}
class Program
{
static void Main(string[] args)
{
var assemblyName = Assembly.GetExecutingAssembly().FullName;
var className = "GetTypeTest.FindMe";
var classAndAssembly = string.Format("{0}, {1}", className, assemblyName);
// 1) GetType succeeds when input is "class, assembly", using method group
var result = new[] { classAndAssembly }.Select(Type.GetType).ToArray();
Console.WriteLine("1) Method group & class+assembly: {0}", result.First());
// 2) GetType fails when input is just the class name, using method group
var result2 = new[] { className }.Select(Type.GetType).ToArray();
Console.WriteLine("2) Method group & class name only: {0}", result2.First());
// 3) Identical to (2) except using lamba expression - this succeeds...
var result3 = new[] { className }.Select(s => Type.GetType(s)).ToArray();
Console.WriteLine("3) Lambda expression & class name only: {0}", result3.First());
// 4) Method group and core type class name
var result4 = new[] { "System.String" }.Select(Type.GetType).ToArray();
Console.WriteLine("4) Method group for System.String: {0}", result4.First());
Console.ReadLine();
}
}
}
#2 が失敗するのに #3 が成功する理由を知りたいです。