質問編集履歴

2

微調整

2017/01/09 12:24

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
File without changes
test CHANGED
@@ -210,8 +210,10 @@
210
210
 
211
211
 
212
212
 
213
- どうう設計が一般的考えられと思い質問したのですが、情報不足した
213
+ 型のmappingみたなことをコンパイル時ことは可能か質問したのですが、無理そうすね・・・
214
+
214
-
215
+ 一般的な実装について聞くには情報不足でした。
215
-
216
-
216
+
217
+
218
+
217
- iwamoto_takaakiさんの提案していただいた方法はかなりトリッキーです・・・、私は好きだけどいいんだろうか、こんな設計・・・。
219
+ iwamoto_takaakiさんの提案していただいた方法はかなりトリッキーとのことです・・・、私は好きだけどいいんだろうか、こんな設計・・・。

1

質問の経緯を追記

2017/01/09 12:24

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
File without changes
test CHANGED
@@ -115,3 +115,103 @@
115
115
 
116
116
 
117
117
  C#の場合こういうことはできないのでしょうか?
118
+
119
+
120
+
121
+ ---
122
+
123
+
124
+
125
+ 追記
126
+
127
+
128
+
129
+ 状況としてはWin32APIをWrapしようとしています。
130
+
131
+ Win32APIの[NetShareEnum](https://msdn.microsoft.com/ja-jp/library/cc446966.aspx)関数は第二引数によって、第三引数から返されるものが変化し、
132
+
133
+ 第二引数が0, 1, 2, 502の時、それぞれ``SHARE_INFO_0``,``SHARE_INFO_1``,``SHARE_INFO_2``,``SHARE_INFO_502``の4つの構造体のいずれかを指すポインタを返します。
134
+
135
+
136
+
137
+ とりあえず第二引数に2を指定するものをラップしたのが
138
+
139
+
140
+
141
+ https://bitbucket.org/yumetodo/netshareenum/src/d2f19f705267259cf3b899cf0bbcbacd9fe71e05/NetShareEnum/Program.cs?at=master&fileviewer=file-view-default
142
+
143
+
144
+
145
+ です。
146
+
147
+
148
+
149
+ ```csharp
150
+
151
+ public static List<SHARE_INFO_2> NetShareEnum_2_wrap(string serverName) {
152
+
153
+ var re = new List <SHARE_INFO_2> { };
154
+
155
+ Int32 er = 0;
156
+
157
+ Int32 tr = 0;
158
+
159
+ Int32 resume = 0;
160
+
161
+ int res;
162
+
163
+ do
164
+
165
+ {
166
+
167
+ res = NetShareEnum(serverName, 2, out var bufPtr, -1, ref er, ref tr, ref resume);
168
+
169
+ if (res != (int)NET_API_STATUS.NERR_Success && res != (int)NET_API_STATUS.ERROR_MORE_DATA) break;
170
+
171
+ var infoP = bufPtr;
172
+
173
+ for (int i = 0; i < er; ++i)
174
+
175
+ {
176
+
177
+ re.Add(Marshal.PtrToStructure<SHARE_INFO_2>(infoP));
178
+
179
+ infoP = IntPtr.Add(infoP, Marshal.SizeOf<SHARE_INFO_2>());
180
+
181
+ }
182
+
183
+ NetApiBufferFree(bufPtr);
184
+
185
+ } while (res == (int)NET_API_STATUS.ERROR_MORE_DATA);
186
+
187
+ return re;
188
+
189
+ }
190
+
191
+ ```
192
+
193
+
194
+
195
+ これを一般化するために
196
+
197
+
198
+
199
+ まずはdynamicを使うことを考えましたが、できれば静的にやりたいなと思い却下し
200
+
201
+
202
+
203
+ 空のinterfaceクラスをでっち上げて``SHARE_INFO_x``クラスに指定し、Genericsの制約に使用することも考えましたが、[空のinterfaceクラスは良くない](https://msdn.microsoft.com/ja-jp/library/ms182128.aspx)という記事が見つかり、またマーシャリングと組み合わせられるのかわからず断念し、
204
+
205
+
206
+
207
+ そこで上述のような静的型mapみたいなことを思いついたわけですが、C#のGenericsだと値は
208
+
209
+ 渡せなかったのを思い出し、諦め、
210
+
211
+
212
+
213
+ どういう設計が一般的に考えられるのかと思い質問したのですが、情報不足でした。
214
+
215
+
216
+
217
+ iwamoto_takaakiさんの提案していただいた方法はかなりトリッキーですね・・・、私は好きだけどいいんだろうか、こんな設計・・・。