是否可以遍歷幾個通用實體并對其進行處理?
public class Dynamic<T>
{
public T value;
public T defaultVal;
public void SetDefaultValue()
{
value = defaultVal;
}
}
是否有可能讓它看起來像這樣:
List<Dynamic<T>> dynamics = new List<Dynamics<T>>();
dynamics.Add(new Dynamic<float>());
dynamics.Add(new Dynamic<Vector2>());
///...
foreach (var item in dynamics)
{
item.SetDefaultValue();
}
是的,它可能根本沒用,因為我必須在該串列中手動插入這些值,但我真的想知道它是否可能。
uj5u.com熱心網友回復:
dynamics使用您擁有的資料模型,在 c# 2.0 中,除了宣告為 aList<object>并使用反射之外,沒有其他方法可以做您想做的事情:
List<object> dynamics = new List<object>();
dynamics.Add(new Dynamic<float>());
dynamics.Add(new Dynamic<Vector2>());
foreach (var item in dynamics)
{
item.GetType().GetMethod("SetDefaultValue").Invoke(item, null);
}
不太推薦,因為性能會很差,并且您會丟失編譯時的正確性檢查。
Dynamic<T>相反,考慮引入一個允許以非泛型方式訪問所需成員的非泛型介面:
public interface IDynamic
{
// Provide read-only access to the Value and DefaultValue as objects:
object Value { get; }
object DefaultValue { get; }
// Set the value to the default value:
void SetDefaultValue();
}
public class Dynamic<T> : IDynamic
{
public T value;
public T defaultVal;
public void SetDefaultValue()
{
value = defaultVal;
}
// Use explicit interface implementation because we don't want people to use the non-generic properties when working directly with a specific Dynamic<T>:
object IDynamic.Value { get { return value; } } // Note that if T is a struct the value will get boxed
object IDynamic.DefaultValue { get { return defaultVal; } } // Note that if T is a struct the value will get boxed
}
現在您將能夠:
List<IDynamic> dynamics = new List<IDynamic>();
dynamics.Add(new Dynamic<float>());
dynamics.Add(new Dynamic<Vector2>());
foreach (var item in dynamics)
{
item.SetDefaultValue();
}
uj5u.com熱心網友回復:
擴展 dbc 的答案,將類的屬性存盤在一個串列中以立即更改它們并通過參考將它們包裝到一個類中,對于這種情況Dynamic<whatever>,因為如果你有原始/值型別,那些將被復制到串列,甚至屬性值都在串列中回圈更改,您將更改串列副本而不是類屬性本身。像這樣:
using System;
using System.Collections.Generic;
using UnityEngine;
public class GenericTrial2 : MonoBehaviour {
Dynamic<float> vertical = new Dynamic<float> { value = 17, defaultVal = 1 };
Dynamic<Vector2> run = new Dynamic<Vector2> { value = new Vector2(17, 17), defaultVal = Vector2.one };
Dynamic<Quaternion> rotation= new Dynamic<Quaternion> { value = new Quaternion(4,4,4,4), defaultVal = Quaternion.identity };
List<IDynamic> dynamics;
private void Start() {
dynamics = new List<IDynamic>();
dynamics.Add(vertical);
dynamics.Add(run);
dynamics.Add(rotation);
dynamics.ForEach(prop => { Debug.Log(prop.Value.ToString()); });
Debug.Log($"initValues: vertical: {vertical.value.ToString()}, "
$"run: {run.value.ToString()}, rot: {rotation.value.ToString()} ");
}
void resetProps() {
foreach (var item in dynamics) {
item.SetDefaultValue();
}
dynamics.ForEach(prop => { Debug.Log(prop.Value.ToString()); });
}
private void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
resetProps();
Debug.Log($"after reset: vertical: {vertical.value.ToString()}, "
$"run: {run.value.ToString()}, rot: {rotation.value.ToString()} ");
}
}
}
public interface IDynamic {
// Provide read-only access to the Value and DefaultValue as objects:
object Value { get; }
object DefaultValue { get; }
// Set the value to the default value:
void SetDefaultValue();
}
public class Dynamic<T> : IDynamic {
public T value;
public T defaultVal;
public void SetDefaultValue() {
value = defaultVal;
}
// Use explicit interface implementation because we don't want people to use the non-generic properties when working directly with a specific Dynamic<T>:
object IDynamic.Value { get { return value; } } // Note that if T is a struct the value will get boxed
object IDynamic.DefaultValue { get { return defaultVal; } } // Note that if T is a struct the value will get boxed
}
輸出:
initValues: vertical: 17, run: (17.0, 17.0), rot: (4.0, 4.0, 4.0, 4.0)
after reset: vertical: 1, run: (1.0, 1.0), rot: (0.0, 0.0, 0.0, 1.0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/448012.html
上一篇:Unity比較游戲物件
下一篇:Apex上的圖表過濾器
