В ActionScript свойство объекта может быть доступ таким образом:Доступ к свойствам объекта из строки представлений
object["propertyname"]
ли что-то подобное возможно в C#, без использования отражения?
В ActionScript свойство объекта может быть доступ таким образом:Доступ к свойствам объекта из строки представлений
object["propertyname"]
ли что-то подобное возможно в C#, без использования отражения?
Нет, вы должны использовать отражение.
Если можно было максимально создать метод расширения помощник как в этом примере:
using System;
static class Utils {
public static T GetProperty<T>(this object obj, string name) {
var property = obj.GetType().GetProperty(name);
if (null == property || !property.CanRead) {
throw new ArgumentException("Invalid property name");
}
return (T)property.GetGetMethod().Invoke(obj, new object[] { });
}
}
class X {
public string A { get; set; }
public int B { get; set; }
}
class Program {
static void Main(string[] args) {
X x = new X() { A = "test", B = 3 };
string a = x.GetProperty<string>("A");
int b = x.GetProperty<int>("B");
}
}
Это не хорошо, однако.
Во-первых, потому что вы переводите ошибки времени компиляции во время выполнения ошибок.
Во-вторых, ударный удар от отражения в этом случае необоснован. Я думаю, что лучший совет здесь заключается в том, что вы не должны пытаться программировать на C#, как если бы это был ActionScript.
Вы можете определить индексатор в классе:
public class IndexerTest
{
private Dicionary<string, string> keyValues = new ...
public string this[string key]
{
get { return keyValues[key]; }
set { keyValues[key] = value; }
}
}
И использовать его как это:
string property = indexerTest["propertyName"];
Синтаксис-скобка немного промахивается. в объекте ECMA-script [выражение] эквивалентно object.ident, если строковое представление выражения является «ident». То, что Bert, похоже, ищет, - столь же короткий путь для динамического доступа к свойствам в C#. – back2dos
Thx для ответа. Мне было просто интересно, если избежать отражения, это вариант, из-за проблем с производительностью. В этом случае код будет использоваться в рекурсивном методе составной структуры объекта, который используется довольно много. Является ли размышлением путь сюда? –
@Bert Vandamme: Я бы сказал, чтобы использовать отражение только тогда, когда вы не знаете объект tpye a priori, но можете ли вы сделать пример? –
Я предполагаю, что в точке, где вы знаете тип свойства, вы также должны знать тип владельца достаточно хорошо, чтобы избежать отражения, даже если он был абстрагирован только с интерфейсом, определяющим это единственное свойство. :) Согласен, рефлексию следует использовать, только если вы просто ничего не знаете во время компиляции. – back2dos