Получите имя свойства класса

Для некоторых устройств, если язык по умолчанию установлен разным (индиец может установить английский (США)), тогда

#include <iostream>
#include <math.h>
#include <vector>
#include <ostream>

using namespace std;

struct Point {
    int x,y;
};

int distance (const Point& a,const Point& b){
    int k= sqrt(((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y)));
}

int main(){
    return 0;
}

выдаст неверное значение. Так что этот метод ненадежен

[g2] Кроме того, метод getNetworkCountryIso () в TelephonyManager не будет работать на устройствах без SIM-карты (планшеты WIFI). [/g2] [g3] Если на устройстве нет SIM-карты, мы можем использовать часовой пояс для получить страну. Для таких стран, как Индия, этот метод будет работать с примером кода [/g3] [g4], который используется для проверки того, является ли страна Индией или нет (идентификатор часового пояса: asia / calcutta) [/g4]
1>------ Build started: Project: distance, Configuration: Debug Win32 ------
1>  distance.cpp
1>d:\...\distance.cpp(13): error C2668: 'sqrt' : ambiguous call to overloaded function
1>          c:\...\vc\include\math.h(589): could be 'long double sqrt(long double)'
1>          c:\...\vc\include\math.h(541): or       'float sqrt(float)'
1>          c:\...\vc\include\math.h(127): or       'double sqrt(double)'
1>          while trying to match the argument list '(const int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
11
задан 30 September 2008 в 08:34
поделиться

6 ответов

Вот пример того, о чем я говорю:

[AttributeUsage(AttributeTargets.Property)]
class TextProperyAttribute: Attribute
{}

class MyTextBox
{
    [TextPropery]
    public string Text { get; set;}
    public int Foo { get; set;}
    public double Bar { get; set;}
}


static string GetTextProperty(Type type)
{
    foreach (PropertyInfo info in type.GetProperties())
    {
        if (info.GetCustomAttributes(typeof(TextProperyAttribute), true).Length > 0)
        {
            return info.Name;
        }
    }

    return null;
}

...

Type type = typeof (MyTextBox);

string name = GetTextProperty(type);

Console.WriteLine(name); // Prints "Text"
6
ответ дан 3 December 2019 в 07:14
поделиться

При использовании C# 3.0 существует способ получить название свойства динамично, без твердого кодировал его.

private string GetPropertyName<TValue>(Expression<Func<BindingSourceType, TValue>> propertySelector)
{
    var memberExpression = propertySelector.Body as MemberExpression;
    return memberExpression != null 
           ? memberExpression.Member.Name 
           : string.empty;
}

Где BindingSourceType имя класса Вашего экземпляра объекта источника данных.

Затем Вы могли использовать лямбда-выражение для выбора свойства, которое Вы хотите связать способом со строгим контролем типов:

this.textBox.DataBindings.Add(GetPropertyName(o => o.MyClassProperty),
                              this.myDataSourceObject,
                              "Text");

Это позволит Вам осуществлять рефакторинг свой код безопасно, не тормозя весь Ваш материал привязки данных. Но использование деревьев выражений совпадает с отражением использования, с точки зрения производительности.

Предыдущий код довольно ужасен и непроверен, но Вы получаете идею.

8
ответ дан 3 December 2019 в 07:14
поделиться

Иронически отражательный ожидает, что Вы обеспечиваете имя свойства для получения, это - информация :)

Можно создать пользовательский атрибут, применить его к желаемому свойству. Затем Вы сможете просто получить название свойства, имеющего этот атрибут.

3
ответ дан 3 December 2019 в 07:14
поделиться

У Вас будет та же проблема с помощью отражения, потому что для нахождения правильного свойства в свойствах всего типа, необходимо будет знать его имя, правильно?

0
ответ дан 3 December 2019 в 07:14
поделиться

Можно отразить Тип, но Вы не можете отразить его участников кроме по имени.

Если бы это было единственным свойством, или Вы знали наверняка упорядочивание, то Вы могли бы найти его индексом, но вообще говоря, строка является самым безопасным способом пойти.

Я полагаю, что менять имя вызовет исключение на этапе выполнения, но не является на 100% бесспорным ни в одном случае, который является, вероятно, лучшей возможностью.

Принятие никакого исключения происходит автоматически, Вы могли добавить Отладку. Утверждайте, что проверки, чтобы видеть, существует ли свойство тем именем, но снова который является временем выполнения только.

0
ответ дан 3 December 2019 в 07:14
поделиться

1) Укажите точное имя свойства, что Вы хотите и сохраняете его тем путем

2) Запишите тест, включающий то имя свойства.

0
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: