D'obtenir une valeur de type anonyme
J'ai une méthode comme suit:
public void MyMethod(object obj){
//implement
}
Et je l'appelle comme ceci:
MyMethod(new { myparam= "waoww"});
Alors, comment puis-je mettre en œuvre MyMethod()
pour obtenir myparam valeur?
Modifier
J'utilise ceci:
dynamic d= obj;
string param = d.myparam;
mais l'erreur de montée :
'object' does not contain a definition for 'myparam'
aussi j'utilise le point d'arrêt et je vois les d ont myparam chaîne de propriété.
Et est-il un moyen de vérifier le type dynamique de si contiennent tout bien comme ceci:
if(d.contain(myparam))?
Edition II
C'est mon code principal:
public static MvcHtmlString SecureActionLink(this HtmlHelper htmlHelper,
string linkText, string actionName, string controllerName,
object routeValues, object htmlAttributes) {
string areaName =
(string)htmlHelper.ViewContext.RouteData.DataTokens["area"];
dynamic areaObject = routeValues;
if(areaObject != null && !string.IsNullOrEmpty(areaObject.area))
areaName = areaObject.area;
//more
}
et l'appeler comme:
<p>@Html.SecureActionLink("Secure Link between Areas", "Index", "Context",
new { area = "Settings" }, null)</p>
Et l'Erreur est:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a
definition for 'area'
Line 303: dynamic areaObject = routeValues;
Line 304:
Line 305: if(areaObject != null && !string.IsNullOrEmpty(areaObject.area))
Line 306: areaName = areaObject.area;
Line 307:
Source File: D:\Projects\MyProject\HtmlHelpers\LinkExtensions.cs Line: 305
Modifier III
C'est mon AssemblyInfo de HtmlHelper définition:
[assembly: AssemblyTitle("MyProject.Presentation")]
[assembly: InternalsVisibleTo("cpanel.MyProject.dev")]
mais il y a une erreur encore: 'object' does not contain a definition for 'area'
J'utilise les différentes assemblées, mais comment peut-il possible, lorsque j'utilise le point d'arrêt, je peux voir que ma dynamique areaobject
ont area
nom de la propriété et aussi je peux voir la valeur, mais l'erreur de dire: 'object' does not contain a definition for 'area'
je peux pas comprendre comment il peut être possible?
Modifier
- Je changer l'assemblée et maintenant de type dynamique interne mais l'erreur reste comme avant
Pourquoi essayez-vous de le faire? C'est probablement une mauvaise idée.
J'étais même réponse avec cet article. stackoverflow.com/questions/5286695/...
OriginalL'auteur Saeid | 2012-03-17
Vous devez vous connecter pour publier un commentaire.
Utiliser celui-ci:
OriginalL'auteur Saeid
Eh bien, vous pourriez utiliser typage dynamique si vous êtes à l'aide de C# 4:
Il ne poser la question de savoir pourquoi vous n'êtes pas à l'aide d'un type nommé. Les types anonymes ne sont pas vraiment conçus pour être partagés entre les différentes méthodes de ce genre.
EDIT: Note que si c'est dans un montage différent du code d'origine de la création de l'objet, vous aurez besoin d'utiliser
[InternalsVisibleTo]
que les types anonymes sont internes.dynamic d= obj; string param = d.myparam;
mais l'erreur de montée: l '"objet" ne contient pas une définition pour 'myparam" aussi je utiliser de point d'arrêt et je vois led
ont myparam chaîne de propriété.Et est-il un moyen de vérifier le type dynamique de si contiennent tout bien comme ceci:
if(d.contain(myparam))
?cela pourrait devrait fonctionner. Pourriez-vous poster le code complet qui ne fonctionne pas pour vous? Pour vérifier si un objet possède une propriété, vous devez utiliser la réflexion ou intercepter l'exception de la
dynamic
liaison lancers.- Je mettre à jour question
Est-ce dans un montage différent? Les types anonymes sont internes. Modifier.
OriginalL'auteur Jon Skeet
Tout d'abord, comme d'autres l'ont dit: à ne pas faire en premier lieu. Ce n'est pas la façon dont les types anonymes étaient destinés à être utilisés.
Deuxième, si vous êtes enclins à le faire, il y a un certain nombre de façons de le faire. La lente et dangereuse façon est d'utiliser des dynamiques, comme d'autres l'ont dit.
Les de rapides et dangereux façon est d'utiliser des "cast par exemple:
Utiliser La Réflexion. Bien sûr, si vous allez utiliser la Réflexion puis il n'est pas nécessaire d'utiliser dynamique, en premier lieu,. Vous utilisez dynamique de éviter l'utilisation de la Réflexion, donc, si vous allez à l'aide de la Réflexion, de toute façon, vous pourriez tout aussi bien continuer à l'utiliser.
Il semble que vous essayez de faire quelque chose qui est difficile à faire en C#. Je réévaluer si vous voulez faire cela, et si vous le faites, si C# est le langage pour vous. Un langage dynamique comme IronPython peut-être un meilleur ajustement pour votre tâche.
[A]<>f__AnonymousType0
1[Système.String]cannotbecastto [B]<>f__AnonymousType01[System.String].Type A originates from 'App_Web_c3frks2a,Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context'Default'at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\~..\App_Web_c3frks2a.dll'. Type B originates from 'Myproject,Version=1.0.0.0,Culture=neutral, PublicKeyToken=null'in the context 'Default'at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\~..\assembly\dl3\~ ..\MyProject.DLL
Coulée par exemple ne fonctionne que sur les types anonymes que sont les tous dans le même assembly. Si vous déclarez un type appelé C dans une assemblée, vous ne pouvez pas convertir un type différent aussi appelé C dans une autre assemblée; les types anonymes sont de la même manière. Les types anonymes n'étaient pas destinés à être utilisés dans des assemblages; utilisation d'un type nominal, pas un type anonyme.
OriginalL'auteur Eric Lippert
Tout le monde dit "ne fais pas cela, en premier lieu", mais c'est exactement ce que asp.mvc ne!
(Ne vous méprenez pas, je ne l'aime pas moi-même, mais si vous écrivez votre propre code html helpers que vous voulez l'appeler de la manière que vous appelez la normale html helpers...)
Et vous pouvez utiliser asp.mvc pour rendre votre vie plus facile:
Quand je suis en train d'écrire une page ASP.MVC fonction d'assistance, il faut, à mon avis, être conformes aux normes de l'ASP.MVC fonctions d'assistance. Et si la plupart des ASP.MVC fonctions d'assistance acceptent des paramètres comme les types anonymes alors je pense que je devrais le supporter. Sinon, il cause
Aussi, Si je suis en train d'écrire du code qui accepte des paramètres autres que les types anonymes et doivent ensuite passer à (par exemple) le additionalViewData paramètre pour Html.EditorFor() puis-je convertir mes paramètres d'un objet anonyme. Savez-vous comment convertir un Dictionnaire à un objet anonyme ?
OriginalL'auteur Nadav