Merrion Square

merrionsq.exblog.jp ブログトップ

カテゴリ:プログラミング( 4 )

Visual Studio: 子「partial class」を「Solution Explorer」上でネスト表示させる

「partial class」は、例えばファンクションの種類ごとにファイルを分けて、1つのクラスを管理するのに便利ですが、ファイルが増えると今度はソリューション・エクスプローラ上でたいへんなことになってきます。

フォルダーを作って整理することもできますが、ここでは親「partial class」クラスを折りたたみ表示にして子「partial class」をネストしてしまう方法を紹介します。

フォルダーで「partial class」を管理するとこのようになると思います。
a0030714_5145359.jpg


子「partial class」をネスト化した後はこのようになります。
a0030714_5153391.jpg


このようにシンプルな例だと、ネストが増えただけで、見た目はフォルダーでの管理と変わらないですが、例えば「MyClasses」フォルダー内で、「partial class」で構成された複数のクラスを管理する場合など、ファイル構成をずいぶんすっきりさせることができると思います。

残念ながら「Visual Studio」のUI上でこのようにネスト化することはできないようなので、「*.csproj」をノートパッドなどを使って手書きでエディットしないといけないですが、大きなプロジェクトでは特に、後の管理を考えると試す価値はあると思います。

1.子「partial class」の名前は「親部分クラス名.子部分クラス名」にします。例:親が「MyClass.cs」の場合、子は「MyClass.Partial01.cs」

2.プロジェクト・ファイル(*.csproj)をノートパッドで開きます。CSファイルは以下のように管理されています。
a0030714_631594.gif


3.もし親「partial class」が一番上に来て、子「partial class」がその下に来るような配置になっていなければ、その順番に並べ替えます。

4.「Compile ...」の省略クローズタグ「/」を取って、「/Compile」で閉じます。

5.「DependentUpon」タグを子「partial class」の下に追加します。

6.「DependentUpon」タグ内に親「partial class」ファイル名を入れます。ここまでで以下のようになっているか確認します。

a0030714_6312079.gif


7.「*.csproj」を保存します。プロジェクトが「Visual Studio」ですでに開かれている場合は、プロジェクトをリロードかどうか聞いてくるので、リロードし「partial class」がネストされているかを確認してください。

注意点ですが、、
ファイル名が「1」で述べたようになっていなかったり、
ファイルの並びが「3」のようになっていない
と、きちんとネストできないので注意してください。

実は「partial class」であるないにかかわらず、ファイル名と、タグ構成が上記のようになっていさえすれば、まったく関係ないクラス・ファイルでもネストすることができます。
僕はそのクラスのインターフェイスを作らないといけない場合、「IMyClass」のファイル名を「MyClass.IMyClass.cs」にして、MyClassにネストしてまとめたりしています。
[PR]
by p_n_t | 2010-07-23 07:15 | プログラミング

C#: 「delegate」と「Lambda Expressions」を使って無駄を減らす

ほとんど同じだけど、微妙に違うところがあるので、似たMethodを複数書かないといけないとします。

例えば、「Common Action 1」と「Common Action 2」は常にプリントアウトされなければならない。
しかし「Method1」では「Unique Action 1」を、「Method2」では「Unique Action 2」を2つの「Common Action」の前にそれぞれプリントアウトしなければならない。
従って2つの似たMethodを書いてしまったとします。

static void Main(string[] args)
{
Method1();
Method2();
}

static void Method1()
{
Console.WriteLine("Unique Action 1");
Console.WriteLine("Common Action 1");
Console.WriteLine("Common Action 2");
}

static void Method2()
{
Console.WriteLine("Unique Action 2");
Console.WriteLine("Common Action 1");
Console.WriteLine("Common Action 2");
}


でも、これでは同じコードを何回も書くのも面倒だし、なによりメンテナンスが大変です。

例えば「Common Action 1」と「Common Action 2」の間に「Common Action 1.5」をプリントアウトしなくてはならなくなったとすると、2箇所の修正が必要になります。
修正がそれぐらい単純で、2つのMethodだけしかないとかならまだしも、似たMethodがもっと多かったり、共通部分の変更箇所がさらに多く複雑になったりすると、考えただけでぞっとします。

そこで、

delegate」と「Lambda Expressions (C# 3.0+)」を使って、共通部分のためのMethodを1つだけ作り、「Unique Action X」の部分ををパラメター化することで、コードを簡単化します。

public delegate void Action();

static void Main(string[] args)
{
Method(() => Console.WriteLine("Unique Action 1"));
Method(() => Console.WriteLine("Unique Action 2"));
}

static void Method(Action action)
{

action();
Console.WriteLine("Common Action 1");
Console.WriteLine("Common Action 2");
}

ちなみに、「()=>」(Lambda Expressions)の「=>」の後は、「{}」を使うことで、コードブロックも入れることが可能です(その際、各行は「;」で終わらせる必要があります)。

Method(() =>
{
Console.WriteLine("Unique Action 1");
Console.WriteLine("Unique Action 2");
}
);
[PR]
by p_n_t | 2010-06-20 07:51 | プログラミング

C#: LINQ: Convert a LINQ Query Resultset to a DataTable

Convert a LINQ Query Resultset to a DataTable

public DataTable ToDataTable(System.Data.Linq.DataContext ctx, object query)
{
if (query == null)
{
throw new ArgumentNullException("query");
}

IDbCommand cmd = ctx.GetCommand(query as IQueryable);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = (SqlCommand)cmd;
DataTable dt = new DataTable("sd");

try
{
cmd.Connection.Open ();
adapter.FillSchema(dt, SchemaType.Source);
adapter.Fill(dt);
}
finally
{
cmd.Connection.Close();
}
return dt;
}
[PR]
by p_n_t | 2010-06-18 09:25 | プログラミング

C#: Enums

How to enumerate an enum:

foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
}


Enhance Enums using Extension Methods:

public enum LocalizationMarket
{
[Description("en-US")]
English = 1,
[Description("en-ES")]
Spanish = 2
}
public static class LocalizationMarketExtensions
{
public static string ToDescriptionString(this LocalizationMarket val)
{
DescriptionAttribute[] attributes = (DescriptionAttribute[])val.GetType().GetField(val.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : string.Empty;
}
}
[PR]
by p_n_t | 2010-06-18 08:53 | プログラミング
line

アイルランドのダブリンで、日々の生活で思いついたことを書いたり、アイルランド国内や旅先(主にヨーロッパ)で撮った写真を掲載したりしています。


by p_n_t
line
クリエイティビティを刺激するポータル homepage.excite
カレンダー
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31