C# - Кастинг Отражения. PropertyInfo возражают против его Типа

Стандарт IEEE 754 .

, Конечно, существуют другие средства сохранить числа, когда IEE754 не достаточно хорош. Библиотеки как Java BigDecimal доступны для большинства платформ и отображаются хорошо на тип числа SQL. Символы могут использоваться для иррациональных чисел, и отношения, которые не могут быть точно представлены в двоичной или десятичной плавающей точке, могут быть сохранены как отношение.

5
задан Mehdi 11 June 2016 в 07:08
поделиться

5 ответов

Все это на самом деле довольно очевидно. Я перечисляю только Pythonic способы сделать эти вещи. Обновление: теперь примеры должны работать как в Python 2, так и в Python 3. В Python 2 для повышения эффективности вы можете заменить xrange () на range () и iteritems () на items ().

Пример 1

PHP

$php = array(1,2,3,4,5,6,7,8,9,10);
for ($i = 0; $i < 10 ; $i ++)
echo $php[$i]."<br>";

Python (обычно вы итерируете по спискам в Python вместо доступа по индексу):

lst = [1,2,3,4,5,6,7,8,9,10]
for item in lst:
    print(str(item) + "<br>")

Пример 2

for ($i = 0; $i < 10 ; $i ++)
echo $php[$i] = $i +1 ;

Python:

lst = range(1, 11)
for item in lst:
    print(item)

Или может быть:

lst = []
for i in range(10):
    lst.append(i + 1)
    print(lst[-1])     # prints out last element

Пример 3

$php = array(1,2,3,4,5,6,7,8,9,10);
foreach ($php as $value)
echo $value."<br>";

То же, что и 1-й

Пример 4

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}

Python:

lst = [1, 2, 3, 4]
lst = [val * 2 for val in lst]

Пример 5

$arr = array("mot"=>"one", "hai"=>"two","ba"=> "three");
foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}

Python (обратите внимание, что {...} создает dict [словарь] в Python, а не list /):

dct = {'mot': 'one', 'hai': 'two', 'ba': 'three'}
for key, value in dct.items():
    print("Key: %s; Value: %s<br />" % (key, value))

Пример 6

$arr = array("one", "two","three");
while (list($key, $value) = each($arr)) {
    echo "Key: $key; Value: $value<br />\n";
}

Python:

lst = ['one', 'two', 'three']
for key, value in enumerate(lst):
    print("Key: %d; Value: %s<br />" % (key, value))

Пример 7

$arr = array("one", "two","three");
while ($element = each($arr)) {
    echo "Key: $element['key']; Value: $element['value']<br />\n";
}

Нет прямого эквивалента Python для этого.

Пример 8

$products = array( array("ITL","INTEL","HARD"),
                        array("MIR", "MICROSOFT","SOFT"),
                        array("Py4C", "pythonkhmer.wordpress.com","TUTORIAL")
                         );
for ($row = 0; $row < 3; $row++)
{
    for ($col = 0; $col <3; $col++)
    {
        echo "|".$products[$row][$col];
    }
    echo "<br>";
}

Python:

products = [['ITL', 'INTEL', 'HARD'],
    ['MIR', 'MICROSOFT', 'SOFT'],
    ['Py4C', 'pythonkhmer.wordpress.com', 'TUTORIAL']]

for product in products:
    for item in product:
        print('|' + item)
    print('<br>')

Или, может быть, более питоническая версия : Вы должны быть уверены, что тип загружен в текущий AppDomain, иначе тип не может быть отражен.

Assembly asm = Assembly.GetExecutingAssembly();

// The executing assembly can change also; so you can load types from other assemblies
// use this if the type isn't loaded in this AppDomain yet.
//Assembly asm = Assembly.LoadFile("path to assembly here", new Evidence());

String typeToLoad = "Master.Enterprise"; // this can be from a config or database call
Type objType = asm.GetType(typeToLoad, true);

if (!objType.IsPublic)
return null;

// make sure the type isn't Abstract
if (((objType.Attributes & TypeAttributes.Abstract) == TypeAttributes.Abstract))
    return null;

// IEnterprise is the interface that all of the plugin types must implement to be loaded
Type objInterface = objType.GetInterface("IEnterprise", true);

if (objInterface == null)
    return null;

    var iri = (IEnterprise)Activator.CreateInstance(objType);
    return iri;
1
ответ дан 13 December 2019 в 05:37
поделиться

Мне кажется, что вам нужно определить интерфейс - затем вы можете потребовать, чтобы ваше свойство возвращало объект, реализующий этот интерфейс, и тогда вы сможете выполнять приведение в этот интерфейс независимо от какой класс реализует этот интерфейс:

IEnterprise enterprise = (IEnterprise)property.GetValue(myObject, null);

Единственный другой вариант, который у вас есть, - это вызов методов и свойств возвращаемого объекта с помощью отражения - это то, что делает отладчик Visual Studio.

5
ответ дан 13 December 2019 в 05:37
поделиться
Master.Enterprise enterprise = (Master.Enterprise)property.GetValue(myObject,null);

или

Master.Enterprise enterprise = property.GetValue(myObject,null) as Master.Enterprise;

Первый вызовет исключение, если тип несовместим. Второй вернет null, если несовместим.

3
ответ дан 13 December 2019 в 05:37
поделиться

Если тип неизвестен во время компиляции, и вы не можете предположить, что он реализует известный интерфейс, вы не можете привести его к этому типу, потому что C # является языком со статической типизацией.

Вы сможете сделать это с помощью C # 4.0, если хотите дождаться этого / использовать бета-версию, например:

dynamic obj=property.GetValue(myObject,null);
obj.CallSomeMethod();

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

2
ответ дан 13 December 2019 в 05:37
поделиться

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

1
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

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