2013-11-15 56 views
0

Windows Store/WinRT應用程序的反思與我以前的不同。我如何重構此代碼塊以使用WinRT?如何使此反射與WinRT一起使用

注意:此代碼塊在PCL中工作,不針對Windows應用商店應用程序。 (Profile104)。只要我將目標更改爲Profile158,它就不會再編譯了。

var migrationInterfaceType = typeof (IMigration); 
var migrations = 
    migrationInterfaceType.Assembly.GetTypes() 
          .Where(type => migrationInterfaceType.IsAssignableFrom(type) && !type.IsAbstract) 
          .OrderBy(type => type.Name); 

// Cannot resolve symbol 'Assembly' 
// Cannot resolve symbol 'IsAssignableFrom' 

本質上講,我們有一個名爲IMigration的接口。然後我們有一個繼承IMigration的抽象類(Migration)。從那裏我們創建我們的遷移如下。

public class Migration001 : Migration{ 

} 

public class Migration002 : Migration{ 

} 

// and so on. 

我正在與需要做掙扎的代碼是提取所有遷移到一個IEnumerable <>讓我能在他們環路,爲了運行它們。正如我之前所說的,第一個代碼塊時,它不針對WinRT的工作,但現在它需要,它不會編譯由於

// Cannot resolve symbol 'Assembly' 
// Cannot resolve symbol 'IsAssignableFrom' 

我曾嘗試兩種不同的方法,但兩者產生的任何結果在IEnumberable <>

失敗的嘗試ONE

var migrations = 
    typeof(IMigration).GetTypeInfo().Assembly.DefinedTypes 
          .Where(type => type.IsSubclassOf(typeof(IMigration)) && !type.IsAbstract) 
          .OrderBy(type => type.Name); 

// enumeration yielded no results 

失敗的嘗試TWO

var migrationInterfaceType = typeof (IMigration); 
var migrations = migrationInterfaceType.GetTypeInfo().Assembly.DefinedTypes 
          .Where(type => migrationInterfaceType.GetTypeInfo().IsSubclassOf(type.GetType()) && !type.IsAbstract) 
          .OrderBy(type => type.Name); 

// enumeration yielded no results 

以防萬一你想知道,這裏是我如何運行遷移......沒有什麼特別的。

foreach (var migration in migrations) 
{ 
    Run(_serviceLocator.GetInstance<IMigration>(migration.Name)); 
} 
+0

什麼是失敗的嘗試的結果,並且你會期待什麼呢?你做[研究](http://msdn.microsoft.com/en-us/library/hh535795(v = vs.110).aspx)?你的第一個評論中的錯誤(你真的應該讓問題更清楚)被回答[這裏](http://stackoverflow.com/questions/7612186/getting-a-type-assembly-in-windows-8),第二個可能會消失。 – CodeCaster

+0

是的,我一直在研究。結果是一個空的'IEnumerable <>'。第一個代碼塊WORK S,而不需要定位Windows應用商店應用。 –

+0

問題是你沒有解釋代碼應該做什麼。你只在註釋中輸入兩個編譯器錯誤,並說它_「不能與WinRT正常工作」_。你應該知道這不是一個準確的問題描述。我想現在通過_「**失敗嘗試**」_你的意思是_「返回一個空的IEnumerable <>'」_,但是這也沒有告訴我們你期望它返回什麼。如果你可以提供更多關於你想要做的事情的信息,它會非常有幫助你的問題。我知道足夠的反思猜測,並與我發現[這](http://stackoverflow.com/questions/7612186/)。 – CodeCaster

回答

2

試驗和錯誤導致了這一點。我想這是一個更加清楚一點:(

var currentAssembly = GetType().GetTypeInfo().Assembly; 
var migrations = currentAssembly.DefinedTypes 
           .Where(type => type.ImplementedInterfaces 
                .Any(inter => inter == typeof (IMigration)) && !type.IsAbstract) 
           .OrderBy(type => type.Name); 
0

試試這個:

var migrations = typeof(IMigration).GetTypeInfo() 
            .Assembly 
            .DefinedTypes 
            .Where(type => type.GetInterfaces() 
                 .Any(itf=> 
             itf == typeof(IMigration)) && 
             !type.IsAbstract) 
            .OrderBy(type => type.Name); 
+0

不幸的是'GetInterfaces'不能用於WinRT。它需要使用'IsSubclassOf' –

0

有被稱爲GetTypeInfo的擴展方法來做到這一點:

using System.Reflection; 

..... 

var migrationInterfaceType = typeof (Migration); 
var migrations = 
    migrationInterfaceType.GetTypeInfo().Assembly.ExportedTypes 
          .Where(type => migrationInterfaceType.GetTypeInfo().IsSubclassOf(type) && !type.IsAbstract) 
          .OrderBy(type => type.Name);