前提・実現したいこと
Unityでリストをinspectorにドロップダウンとして表示させたく、NaughtyAttributesアセットを導入しました。
NaughtyAttributesでは、DropdownList<T>としてリストを定義することでドロップダウン化できるため活用したく思っております。
しかし、DropdownList<T>を定義する際に「= 既存リスト」と直接リストを設定しないとドロップダウンが上手くいかず、キャスト変換を行う必要が出てきました。
キャスト変換の改造を色々試してみたのですが、エラーでつまずいており頭を抱えております。
この問題とそのほかの型も対応できるようやり方をご教授頂きたいです。
DropdownList<T>のソースコード
C#
1public class DropdownList<T> : IDropdownList 2{ 3 private List<KeyValuePair<string, object>> _values; 4 5 public DropdownList() 6 { 7 _values = new List<KeyValuePair<string, object>>(); 8 } 9 10 public void Add(string displayName, T value) 11 { 12 _values.Add(new KeyValuePair<string, object>(displayName, value)); 13 } 14 15 public IEnumerator<KeyValuePair<string, object>> GetEnumerator() 16 { 17 return _values.GetEnumerator(); 18 } 19 20 IEnumerator IEnumerable.GetEnumerator() 21 { 22 return GetEnumerator(); 23 } 24 25 public static explicit operator DropdownList<object>(DropdownList<T> target) 26 { 27 DropdownList<object> result = new DropdownList<object>(); 28 29 foreach (var kvp in target) 30 { 31 result.Add(kvp.Key, kvp.Value); 32 } 33 return result; 34 } 35}
public static explicit operator DropdownList<object>(DropdownList<T> target)
→こちらでDropdownList<object>とDropdownList<T>がキャスト変換できるようになっているのが判明できたので、これを参考に作りたいです。
試したこと
試しにList<string>を作成。
C#
1public static List<string> TestList = new List<string>() { "1", "2", "3", "4" }; 2public DropdownList<string> DropdownTestList = (DropdownList<string>)TestList ;
キャスト変換できるよう、-DropdownList<T>のソースコード-に新たに記載してみました。
C#
1public static explicit operator DropdownList<object>(List<string> target) 2{ 3 DropdownList<object> result = new DropdownList<object>(); 4 5 foreach (var kvp in target) 6 { 7 result.Add(kvp.ToString(), kvp); 8 } 9 return result; 10}
発生している問題・エラーメッセージ
-試したこと-を行った際、以下のエラーが発生します。
C#
1ユーザー定義の変換は、それを囲む型に/から変換しなければなりません。
その後
とりあえず例に挙げていたList<string>のキャストはできることができました。
C#
1public static explicit operator DropdownList<T>(List<string> target) 2{ 3 DropdownList<T> result = new DropdownList<T>(); 4 5 foreach (var kvp in target) 6 { 7 result.Add(kvp.ToString(), kvp); 8 } 9 return result; 10} 11private void Add(string displayName, string value) 12{ 13 _values.Add(new KeyValuePair<string, object>(displayName, value)); 14}
・・・かなり強引は気はしますが…。
ですが、本番ではICollection<ProductCatalogItem>を入れたいと思っております。
なので、
public static explicit operator DropdownList<T>(ICollection<ProductCatalogItem> target)
と設定したところ以下のエラーが…
C#
1'DropdownList<T>.explicit operator DropdownList<T>(ICollection<ProductCatalogItem>)';インターフェイスとの間におけるユーザー定義の変換は許可されません。
こちらのエラーを回避する方法と、先ほどの強引な処理を綺麗にする方法などありますでしょうか?
よろしくお願いいたします。
あなたの回答
tips
プレビュー