Maison >développement back-end >C++ >Puis-je accéder aux objets de type anonyme C# en dehors de leur portée déclarée ?

Puis-je accéder aux objets de type anonyme C# en dehors de leur portée déclarée ?

DDD
DDDoriginal
2024-12-28 17:17:11755parcourir

Can I Access C# Anonymous Type Objects Outside Their Declared Scope?

Accès aux objets de type anonymes en dehors de leur portée déclarée

Les types anonymes en C# offrent un moyen pratique de créer des objets légers et ad hoc. Cependant, accéder à ces objets en dehors de la portée où ils sont déclarés peut être difficile.

Considérez l'exemple de code ci-dessous :

void FuncB()
{
    var obj = FuncA();
    Console.WriteLine(obj.Name);
}

FuncA()
{
    var a = (from e in DB.Entities
        where e.Id == 1
        select new { Id = e.Id, Name = e.Name }).FirstOrDefault();

    return a;
}

Ici, un objet de type anonyme est créé dans la méthode FuncA et renvoyé comme obj. Cependant, dans la méthode FuncB, le compilateur se plaint que obj ne contient pas de définition pour Name.

Pourquoi ne pouvons-nous pas accéder aux propriétés de l'objet de type anonyme en dehors de sa portée déclarée ?

Les types anonymes sont essentiellement des classes générées par le compilateur qui implémentent une interface fortement typée. Lorsque vous créez un type anonyme, le compilateur génère un nom de type unique pour chaque type anonyme unique créé. Ces types sont uniques à l'assembly où ils sont déclarés et ne sont pas accessibles en dehors de cet assembly.

Pouvons-nous accéder aux objets de type anonyme en dehors de leur portée déclarée ?

Techniquement, Oui. Cependant, cela est fortement déconseillé en raison de pénalités de performances potentielles et de problèmes de sécurité.

Une méthode, connue sous le nom de « conversion par exemple », consiste à utiliser la réflexion pour convertir l'objet de type anonyme en un type d'exemple connu. Cependant, cette solution est complexe, peu fiable et peut s'effondrer avec les futures modifications du compilateur.

public void FuncB()
{
    var example = new { Id = 0, Name = string.Empty };

    var obj = CastByExample(FuncA(), example);
    Console.WriteLine(obj.Name);
}

Il est important de noter que l'accès à des objets de type anonyme en dehors de leur portée déclarée peut entraîner un comportement inattendu et n'est généralement pas recommandé. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn