web-dev-qa-db-fra.com

Syntaxe de propagation JavaScript en C #

Existe-t-il une implémentation en C # comme la syntaxe répandue de JavaScript ?

var arr = new []{
   "1",
   "2"//...
};

Console.WriteLine(...arr);
19
jmvtrinidad

Il n'y a pas d'option de propagation. Et il y a des raisons.

  1. Les propriétés ne sont pas un tableau en C # sauf si vous utilisez le mot clé params
  2. Les propriétés qui utilisent le mot-clé param devront soit:
    1. Partager le même type
    2. Avoir un type partagé castable tel que double pour les nombres
    3. Être de type objet [] (comme objet est le type racine de tout)

Cependant, cela dit, vous pouvez obtenir des fonctionnalités similaires avec différentes fonctionnalités linguistiques.

Répondre à votre exemple:

C #

var arr = new []{
   "1",
   "2"//...
};

Console.WriteLine(string.Join(", ", arr));

Le lien que vous fournissez a cet exemple:

Javascript Spread  

function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// expected output: 6

console.log(sum.apply(null, numbers));

Params En C #, avec le même type

public int Sum(params int[] values)
{
     return values.Sum(); // Using linq here shows part of why this doesn't make sense.
}

var numbers = new int[] {1,2,3};

Console.WriteLine(Sum(numbers));

En C #, avec différents types numériques, en utilisant double

public int Sum(params double[] values)
{
     return values.Sum(); // Using linq here shows part of why this doesn't make sense.
}

var numbers = new double[] {1.5, 2.0, 3.0}; // Double usually doesn't have precision issues with small whole numbers

Console.WriteLine(Sum(numbers));

Réflexion En C #, avec différents types numériques, en utilisant objet et réflexion, c’est probablement le plus proche de ce que vous demandez.

using System;
using System.Reflection;

namespace ReflectionExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var paramSet = new object[] { 1, 2.0, 3L };
            var mi = typeof(Program).GetMethod("Sum", BindingFlags.Public | BindingFlags.Static);
            Console.WriteLine(mi.Invoke(null, paramSet));
        }

        public static int Sum(int x, double y, long z)
        {
            return x + (int)y + (int)z;
        }
    }
}
10
Rhyous

il n'y a pas de bibliothèque pré-construite directe en C # pour gérer ce qui est construit dans Spread

Pour obtenir cette fonctionnalité en C #, vous devez refléter l'objet et obtenir les méthodes, les propriétés ou les champs par leurs modificateurs d'accès. 

Vous feriez quelque chose comme:

var tempMethods = typeof(Program).GetMethods();
var tempFields = typeof(Program).GetFields();
var tempProperties = typeof(Program).GetProperties();

puis parcourez-les et jetez-les dans votre objet dynamique:

using System;
using System.Collections.Generic;
using System.Dynamic;

namespace myApp
{
    public class myClass
    {
        public string myProp { get; set; }
        public string myField;
        public string myFunction()
        {
            return "";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var fields = typeof(myClass).GetFields();
            dynamic EO = new ExpandoObject();
            foreach (int i = 0; i < fields.Length; i++)
            {
                AddProperty(EO, "Language", "lang" + i);
                Console.Write(EO.Language);
            }
        }

        public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
        {
            // ExpandoObject supports IDictionary so we can extend it like this
            var expandoDict = expando as IDictionary<string, object>;
            if (expandoDict.ContainsKey(propertyName))
                expandoDict[propertyName] = propertyValue;
            else
                expandoDict.Add(propertyName, propertyValue);
        }
    }
} 

https://www.oreilly.com/learning/building-c-objects-dynamically

0
SamSO