2010-07-11 2 views
2

У меня есть класс примерно разработан как таковой:Как я могу использовать синтаксис-инициализатор массива для пользовательского класса векторов?

class Vector3 
{ 
    float X; 
    float Y; 
    float Z; 

    public Vector3(float x, float y, float z) 
    { 
     this.X = x; 
     this.Y = y; 
     this.Z = z; 
    } 
} 

У меня есть другие классы, реализующие его как свойства, например:

class Entity 
{ 
    Vector3 Position { get; set; } 
} 

Теперь, чтобы установить положение хозяйствующего субъекта, я использую следующие :

Я хотел бы сократить это для пользователя, реализовав инициализатор типа массива для V ector3:

myEntity.Position = { 6, 0, 9 }; 

Однако класс не может наследовать массивы. Более того, я знаю, что я мог каким-то образом удалось получить это с небольшими писак:

myEntity.Position = new[] { 6, 0, 9 }; 

Но это не точка здесь. :)

Спасибо!

ответ

2

Синтаксис синтаксиса синтаксиса синтаксиса отсутствует, кроме массивов. Как вы намекаете, хотя, вы можете добавить оператор (или два) для вашего типа:

public static implicit operator Vector3(int[] value) 
    { 
     if (value == null) return null; 
     if (value.Length == 3) return new Vector3(value[0], value[1], value[2]); 
     throw new System.ArgumentException("value"); 
    } 
    public static implicit operator Vector3(float[] value) 
    { 
     if (value == null) return null; 
     if (value.Length == 3) return new Vector3(value[0], value[1], value[2]); 
     throw new System.ArgumentException("value"); 
    } 

Затем вы можете использовать:

obj.Position = new[] {1,2,3}; 

и т.д. Тем не менее, лично я бы просто оставить его в покое , as:

obj.Position = new Vector3(1,2,3); 

, который включает в себя меньше работы (без распределения/инициализации массива, без вызова оператора).

+0

Я сказал, что у меня уже есть это в вопросе, но это не то, что я хочу. Пожалуйста, внимательно прочитайте. ^^ – Lazlo

+0

@Lazlo - спасибо, но я * сделал * внимательно прочитал. Это не меняет того факта, что нет: без таких хаков вы не сможете этого сделать. –

0

Есть 2 варианта:

1) Использование инициализации объекта Синтаксис:

myEntity.Position = new Vector3(){ X = 6, Y = 0, Z = 9 }; 

2) Создайте contstructor, который принимает массив:

Vector3(float[] array) 
{ 
    // Validate, set X = array[0] etc. 
} 

myEntity.Position = new Vector3(new float[3]{ 6, 0, 9}); 

Я не уверен, если либо легче, чем просто

myEntity.Position = new Vector3(6, 0, 9); 

Что у вас уже есть.

+0

+1 для синтаксиса инициализации объекта. Кроме того, если ваш 'Vector3' изменен из класса в структуру, этот синтаксис вызовет конструктор' Vector3' по умолчанию. В качестве типа значения конструктор по умолчанию может быть встроен компилятором; если вы создаете много многих ваших 'Vector3' s в секунду, это может немного помочь. См .: [Shawn Hargreaves Blog: Inline The Vector Constructors] (http://blogs.msdn.com/b/shawnhar/archive/2007/01/02/inline-those-vector-constructors.aspx) –

+0

Ни один из них не уменьшает количество кода, который пользователь должен ввести. – Lazlo

+0

@ Lazlo right, так как я сказал, что ваш конструктор, вероятно, так короток, как без всяких умных хаков. – TJB

1

Весь смысл запроса состоит в том, чтобы уменьшить общий объем кода. Удобно делать {1, 2, 3}. Кажется странным, что C# не позволяет вам перегружать операторов для этого или разрешить другой способ использования инициализаторов массивов для настраиваемых типов ссылок.

 Смежные вопросы

  • Нет связанных вопросов^_^