Общее ограничение для типов значений может быть хитрым, ValueType
не разрешено в качестве ограничения и не очень полезно, так как, например, Point
также является ValueType
, и вы не хотите или не нуждаетесь определенный тип.
Итак, я предлагаю вам этот безумный метод. Не для публичного использования.
Тип операций, которые могут быть выполнены, определяется перечислителем, поэтому вы не можете неправильно ввести выполняемую операцию, и ее легко расширить, если это необходимо, не нарушая ничего.
Принятые типы значений ограничены результатом локальной функции, которая содержит поддерживаемые типы.
Например, чтобы метод Max
возвращал сравнение между int
и double
, возвращая результат как int
, вы можете назвать его так: 110]
или, получите функцию, затем добавьте параметры при необходимости:
var operationMultiply = GetFunction<int, double, int>(OperationType.Multiply);
var result = operationMultiply(100, 120.5d);
// result = 12050
Func<T1, T2, TR> GetFunction<T1, T2, TR>(OperationType op)
where T1: struct where T2: struct where TR: struct
{
if (!IsSupported(typeof(T1), typeof(T2))) {
throw new NotSupportedException($"Operation on {typeof(T1)} and {typeof(T2)} is not supported.");
}
switch (op)
{
default:
case OperationType.Sum:
return (a, b) => (TR)((dynamic)a + b);
case OperationType.Subtract:
return (a, b) => (TR)((dynamic)a - b);
case OperationType.Multiply:
return (a, b) => (TR)((dynamic)a * (dynamic)b);
case OperationType.Max:
return (a, b) => (TR)Math.Max((dynamic)a, (dynamic)b);
}
bool IsSupported(Type t1, Type t2)
{
Type[] suppTypes = new[] { typeof(int), typeof(decimal), typeof(double), typeof(float) };
if (!suppTypes.Contains(typeof(T1))) return false;
if (!suppTypes.Contains(typeof(T2))) return false;
return true;
}
}
public enum OperationType
{
Sum = 0,
Subtract,
Multiply,
Divide,
Min,
Max,
//Other supported operations
}
Я думаю, что Вы могли бы хотеть изучить serialize
и unserialize
.
$myArray = array('key1'=>'value1', 'key2'=>'value2');
$serialized = serialize($myArray);
$myNewArray = unserialize($serialized);
print_r($myNewArray); // Array ( [key1] => value1 [key2] => value2 )
сериализируйте мог бы быть правильный ответ - но я предпочитаю использовать JSON - человеческое редактирование данных будет возможно тот путь...
$myArray = array('key1'=>'value1', 'key2'=>'value2');
$serialized = json_encode($myArray);
$myNewArray = json_decode($serialized);
print_r($myNewArray); // Array ( [key1] => value1 [key2] => value2 )
Попытайтесь использовать var_export для генерации допустимого синтаксиса PHP, запишите, что в файл и затем 'включают' файл:
$myArray = array('key1'=>'value1', 'key2'=>'value2');
$fileContents = '<?php $myArray = '.var_export($myArray, true).'; ?>';
// ... after writing $fileContents to 'myFile.php'
include 'myFile.php';
echo $myArray['key1']; // Output: value1
Как насчет eval? Вы также должны использовать var_export с возвращаемой переменной как true вместо var_dump.
$myArray = array('key1'=>'value1', 'key2'=>'value2');
$fileContents = var_export($myArray, true);
eval("\$fileContentsArr = $fileContents;");
echo $fileContentsArr['key1']; //output: value1
echo $fileContentsArr['key2']; //output: value2