1

最近、C#プロジェクトを.NET3.5から.NET4にアップグレードしました。指定されたMethodBaseインスタンスのリストからすべてのMSTestテストメソッドを抽出するメソッドがあります。その体は次のようになります。

return null == methods || methods.Count() == 0
    ? null
    : from method in methods
      let testAttribute = Attribute.GetCustomAttribute(method,
          typeof(TestMethodAttribute))
      where null != testAttribute
      select method;

これは.NET3.5で機能しましたが、プロジェクトを.NET 4にアップグレードしてから、。でマークされたメソッドを含むメソッドのリストが指定された場合でも、このコードは常に空のリストを返します[TestMethod]。.NET 4のカスタム属性で何か変更がありましたか?

デバッグの結果GetCustomAttributesData()、テストメソッドの結果から、 CustomAttributeDataVisualStudio2010の[ローカル]ウィンドウに次のように記述されている2つのリストが表示されることがわかりました。

  1. Microsoft.VisualStudio.TestTools.UnitTesting.DeploymentItemAttribute("myDLL.dll")
  2. Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()-これが私が探しているものです

GetType()ただし、その2番目CustomAttributeDataのインスタンスを呼び出すと、が取得され{Name = "CustomAttributeData" FullName = "System.Reflection.CustomAttributeData"} System.Type {System.RuntimeType}ます。のリストからテストメソッドを抽出できるように、TestMethodAttributeどうすればから抜け出すことができますか?CustomAttributeDataMethodBase

4

2 に答える 2

2

TestMethodAttribute私の側の愚かな間違い:私のtest-method-extractingメソッドは、カスタム属性として検索できるようにMicrosoft.VisualStudio.QualityTools.UnitTestFrameworkを参照するクラスライブラリプロジェクトにありました。ソリューションをVS2008からVS2010にアップグレードすると、変換プロセスにより、テストプロジェクトのMicrosoft.VisualStudio.QualityTools.UnitTestFramework、Version = 9.0.0.0からMicrosoft.VisualStudio.QualityTools.UnitTestFramework、Version= 10.0.0.0への参照が自動的に更新されました。 。ただし、クラスライブラリプロジェクトの参照は更新されなかったため、古いUnitTestFramework参照をまだ指していました。そのプロジェクトを10.0.0.0ライブラリを指すように変更したとき、以下のコードは期待どおりに機能しました。

return null == methods || methods.Count() == 0
    ? null
    : from method in methods
      let testAttribute = Attribute.GetCustomAttribute(method,
          typeof(TestMethodAttribute))
      where null != testAttribute
      select method;

また、リファレンスを更新すると、Jonが提案したコードも機能しました。

于 2010-06-01T18:07:49.757 に答える
2

使ってみましたか

method.GetCustomAttributes(typeof(TestMethodAttribute), false)

代わりは?ターゲットにカスタム属性を要求することは、通常、私がそれらをフェッチする方法でした。

急いで例を示します。

using System;
using System.Linq;

[AttributeUsage(AttributeTargets.All)]
public class FooAttribute : Attribute {}

class Test
{
    static void Main()
    {
        var query = typeof(Test).GetMethods()
            .Where(method => method.GetCustomAttributes(
                              typeof(FooAttribute), false).Length != 0);

        foreach (var method in query)
        {
            Console.WriteLine(method);
        }
    }

    [Foo]
    public static void MethodWithAttribute1() {}

    [Foo]
    public static void MethodWithAttribute2() {}

    public static void MethodWithoutAttribute() {}

}
于 2010-06-01T17:46:53.550 に答える