2

わかりました、これは私を困惑させています。Testbase という名前の抽象基本クラスがあり、RunTest という名前の抽象関数があります。フォルダーには、この抽象クラスを継承するクラスのコレクションがあります。テスト コントローラーで次のコードを呼び出して、これらのテスト クラスのインスタンスのリストを作成します。

        String ns = "HCTCommon.Tests";
        var query = from t in Assembly.GetExecutingAssembly().GetTypes()
                    where t.Namespace == ns
                    select t;

        foreach (object t in query)
        {
            TestBase test = (TestBase)Activator.CreateInstance(t as Type);
            testList.Add(test);
        }

RunTest関数のクラスの1つで、コードをクリーンアップしていて、ラムダ式を使用することに決め、さまざまなバージョンを試しました。

pullservice = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == serviceName);

pullservice = ServiceController.GetServices().Where(s => s.DisplayName.Equals("Pull Service")).ToList()[0];

私が覚えているものですが、複雑なforeachループを実行するのではなく、ラムダを使用するたびに、コード行でinvalidcastexceptionが発生します

TestBase test = (TestBase)Activator.CreateInstance(t as Type);

例外:

Unable to cast object of type '<>c__DisplayClass4' to type 'HCTCommon.TestBase'.

Stack Trace:

   at HCTCommon.TestController.populateTestList()
   at HCTCommon.TestController..ctor(RegistryKey Key)
   at HealthCheck.HealthCheckForm.InitializeTestPanels() in C:\Users\bkoch.ESI911\documents\visual studio 2010\Projects\HCTCommon\HealthCheck\HealthCheckForm.cs:line 55
   at HealthCheck.HealthCheckForm..ctor() in C:\Users\bkoch.ESI911\documents\visual studio 2010\Projects\HCTCommon\HealthCheck\HealthCheckForm.cs:line 26
   at HealthCheck.Program.registrycheck() in C:\Users\bkoch.ESI911\documents\visual studio 2010\Projects\HCTCommon\HealthCheck\Program.cs:line 63
   at HealthCheck.Program.Main() in C:\Users\bkoch.ESI911\documents\visual studio 2010\Projects\HCTCommon\HealthCheck\Program.cs:line 34
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
4

2 に答える 2

2

ラムダ式は、ローカル変数を保持するための匿名クロージャクラスを生成します。
コードがこのクラスを誤って取得しています。

追加する必要があります

where typeof(TestBase).IsAssignableFrom(t)
于 2012-05-23T15:38:34.103 に答える
1

Type が実際に拡張されているかどうかを確認する必要がありますTestbase

var testList = (from t in Assembly.GetExecutingAssembly().GetTypes()
                where t.Namespace == ns && typeof(TestBase).IsAssignableFrom(t)
                select (TestBase)Activator.CreateInstance(t)
               ).ToList();
于 2012-05-23T15:40:06.237 に答える