質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1332閲覧

NaughtyAttributesのキャスト変換を改造したい

ishizaku

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/04/03 08:25

編集2020/04/03 09:49

前提・実現したいこと

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>)';インターフェイスとの間におけるユーザー定義の変換は許可されません。

こちらのエラーを回避する方法と、先ほどの強引な処理を綺麗にする方法などありますでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問