前提・実現したいこと
いつもお世話になっております。
先日【【Unity】【C#】独自クラスの異なる型のすべての要素を楽に取り出して表示したい】の内容で質問させていただき、
得た回答を基にプロパティを書き出す処理を実装したのですが、タイトルに書いてあるようにNullがセットされたプロパティをReflection.PropertyInfo
で取得し、Select(x => x.GetValue(a).ToString())
でプロパティを文字列で抜き出したのですが、
これをString.Joinする際にエラーが発生します。
NullReferenceException: Object reference not set to an instance of an object TestCustumList+<>c__DisplayClass7_0.<Update>b__0 (System.Reflection.PropertyInfo x) (at Assets/Unity_UI_Samples-master/Assets/InfiniteScroll/TestCustumList.cs:44) System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].MoveNext () (at <3e4da02cf86b4fc686ed0ac61bffc210>:0) System.String.Join (System.String separator, System.Collections.Generic.IEnumerable`1[T] values) (at <1f0c1ef1ad524c38bbc5536809c46b48>:0) TestCustumList.Update () (at Assets/Unity_UI_Samples-master/Assets/InfiniteScroll/TestCustumList.cs:44)
これを回避するにはどのような方法が考えられますでしょうか?
Nullをセットするな、という回答はご遠慮願います。
該当のソースコード
cs
1using System; 2using System.Linq; 3using System.Collections; 4using System.Collections.Generic; 5using System.Xml.Serialization; 6using UnityEngine; 7 8public class TestCustumList : MonoBehaviour 9{ 10 public class CustumData 11 { 12 public GameObject Value{get; set;} 13 public int Quantity{get; set;} 14 public string ProductName{get; set;} 15 } 16 public List<CustumData> ProductList; 17 18 void Start() 19 { 20 ProductList = new List<CustumData>(); 21 } 22 void Update() 23 { 24 if(Input.GetKeyDown(KeyCode.B)) 25 { 26 //CatchProduct(); 27 var t = new CustumData(){Value = null,Quantity = 1}; 28 ProductList.Add(t); 29 30 foreach(var a in ProductList) 31 { 32 var pro = a.GetType().GetProperties();//aが持つCustumDataのすべてのプロパティを列挙する 33 var i = pro.Select(x => x.GetValue(a).ToString()); 34 35 Debug.Log(i); 36 37 ↓エラー発生箇所 38 Debug.Log(string.Join("/", pro.Select(x => x.GetValue(a).ToString())));//Selectで列挙されたプロパティに対して、aのインスタンスで保持しているプロパティの値を取得し、文字列に変換してIEnumerableとして返す 39 } 40 } 41 } 42}
試したこと
そもそもなぜエラーが発生しているのかがよくわかっていません、
pro.Select(x => x.GetValue(a).ToString())自体は型を文字列で返しているので、単体で抜き出す際にはエラーが出ません。
(Debug.Log(i);の部分)
なので文字自体は存在していると思うのですが、String.Joinの際にNullになる理由が分かりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/27 04:47
2019/12/27 13:40
2019/12/27 16:15
2019/12/28 02:38
2019/12/28 02:43