Bonjour
J'ai un core qui charge des DLLs. J'utilise System.Reflection pour
récupérer les infos sur la DLL.
Dans la DLL, j'ai ajouté ça:
[assembly:AssemblyTitle("First plugin")]
[assembly:AssemblyCompany("MySelf")]
[assembly:AssemblyProduct("My first plugin")]
Ensuite, dans le core, j'essaye de récupérer ces infos. Pour l'instant,
j'arrive à obtenir les types correspondants:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un
Assembly
for(int i = 0; i < myAttributes.Length; i++)
{
Console.WriteLine("attribute {0}", myAttributes[i]);
}
qui me donne:
attribute System.Reflection.AssemblyProductAttribute
attribute System.Reflection.AssemblyCompanyAttribute
attribute System.Reflection.AssemblyTitleAttribute
Mais à partir de là, je n'arrive pas à obtenir le contenu de ces types
("MySelf", "First plugin", ...). J'imagine que ça doit être le meme
prinicpe dans tous les langages .Net.
Mais dans l'exemple, je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute. Comment puis-je faire si je ne connais pas les attributs à l'avance? Est-il possible de faire un cast dynamique du genre:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un Assembly for(int i = 0; i < myAttributes.Length; i++) { (myAttributes[i]) attribute = (myAttributes[i]) Attribute.GetCustomAttribute(currentAssembly, myAttributes[i])); }
J'ai essayé quelque chose de similaire, mais cela ne marche pas car myAttributes[i] est de type object.
Julien
Fabrice MALAINGRE wrote:
Bonjour Julien,
Pour obtenir les attributs dont vous avez besoin, vous pouvez essayer
quelque chose comme ça :
//================================================= > using System;
using System.Reflection;
Mais dans l'exemple, je dois connaître à l'avance que j'aurais à faire à
un AssemblyCompanyAttribute. Comment puis-je faire si je ne connais pas
les attributs à l'avance? Est-il possible de faire un cast dynamique du
genre:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un
Assembly
for(int i = 0; i < myAttributes.Length; i++)
{
(myAttributes[i]) attribute = (myAttributes[i])
Attribute.GetCustomAttribute(currentAssembly, myAttributes[i]));
}
J'ai essayé quelque chose de similaire, mais cela ne marche pas car
myAttributes[i] est de type object.
Mais dans l'exemple, je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute. Comment puis-je faire si je ne connais pas les attributs à l'avance? Est-il possible de faire un cast dynamique du genre:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un Assembly for(int i = 0; i < myAttributes.Length; i++) { (myAttributes[i]) attribute = (myAttributes[i]) Attribute.GetCustomAttribute(currentAssembly, myAttributes[i])); }
J'ai essayé quelque chose de similaire, mais cela ne marche pas car myAttributes[i] est de type object.
Julien
Paul Bacelar
"julien" wrote in message news:4207a41d$0$503$
Fabrice MALAINGRE wrote: > Bonjour Julien, > > Pour obtenir les attributs dont vous avez besoin, vous pouvez essayer > quelque chose comme ça : > > //================================================= > > using System; > using System.Reflection; > > namespace ConsoleApplication1 > { > class Class1 > { > [STAThread] > static void Main(string[] args) > { > Assembly currentAssembly = Assembly.GetExecutingAssembly(); > > AssemblyCompanyAttribute assemblyCompany > > (AssemblyCompanyAttribute) > Attribute.GetCustomAttribute(currentAssembly, > typeof(AssemblyCompanyAttribute)); > > AssemblyProductAttribute assemblyProduct > > (AssemblyProductAttribute) > Attribute.GetCustomAttribute(currentAssembly, > typeof(AssemblyProductAttribute)); > > // Same process for the other attributes... > > Console.WriteLine(assemblyCompany.Company); > Console.WriteLine(assemblyProduct.Product); > } > } > } > //================================================= > > > Cordialement
Merci beaucoup.
Mais dans l'exemple, je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute. Comment puis-je faire si je ne connais pas les attributs à l'avance? Est-il possible de faire un cast dynamique du genre:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un Assembly for(int i = 0; i < myAttributes.Length; i++) { (myAttributes[i]) attribute = (myAttributes[i]) Attribute.GetCustomAttribute(currentAssembly, myAttributes[i])); }
J'ai essayé quelque chose de similaire, mais cela ne marche pas car myAttributes[i] est de type object.
Julien
Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute" ?
C# est un langage typé statiquement, contrairement à la majorité des langages de scripts. -- Paul Bacelar
"julien" <julien@sobrier.net> wrote in message
news:4207a41d$0$503$626a14ce@news.free.fr...
Fabrice MALAINGRE wrote:
> Bonjour Julien,
>
> Pour obtenir les attributs dont vous avez besoin, vous pouvez essayer
> quelque chose comme ça :
>
> //================================================= > > using System;
> using System.Reflection;
>
> namespace ConsoleApplication1
> {
> class Class1
> {
> [STAThread]
> static void Main(string[] args)
> {
> Assembly currentAssembly = Assembly.GetExecutingAssembly();
>
> AssemblyCompanyAttribute assemblyCompany > > (AssemblyCompanyAttribute)
> Attribute.GetCustomAttribute(currentAssembly,
> typeof(AssemblyCompanyAttribute));
>
> AssemblyProductAttribute assemblyProduct > > (AssemblyProductAttribute)
> Attribute.GetCustomAttribute(currentAssembly,
> typeof(AssemblyProductAttribute));
>
> // Same process for the other attributes...
>
> Console.WriteLine(assemblyCompany.Company);
> Console.WriteLine(assemblyProduct.Product);
> }
> }
> }
> //================================================= > >
> Cordialement
Merci beaucoup.
Mais dans l'exemple, je dois connaître à l'avance que j'aurais à faire à
un AssemblyCompanyAttribute. Comment puis-je faire si je ne connais pas
les attributs à l'avance? Est-il possible de faire un cast dynamique du
genre:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un
Assembly
for(int i = 0; i < myAttributes.Length; i++)
{
(myAttributes[i]) attribute = (myAttributes[i])
Attribute.GetCustomAttribute(currentAssembly, myAttributes[i]));
}
J'ai essayé quelque chose de similaire, mais cela ne marche pas car
myAttributes[i] est de type object.
Julien
Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais à
faire à un AssemblyCompanyAttribute" ?
C# est un langage typé statiquement, contrairement à la majorité des
langages de scripts.
--
Paul Bacelar
Fabrice MALAINGRE wrote: > Bonjour Julien, > > Pour obtenir les attributs dont vous avez besoin, vous pouvez essayer > quelque chose comme ça : > > //================================================= > > using System; > using System.Reflection; > > namespace ConsoleApplication1 > { > class Class1 > { > [STAThread] > static void Main(string[] args) > { > Assembly currentAssembly = Assembly.GetExecutingAssembly(); > > AssemblyCompanyAttribute assemblyCompany > > (AssemblyCompanyAttribute) > Attribute.GetCustomAttribute(currentAssembly, > typeof(AssemblyCompanyAttribute)); > > AssemblyProductAttribute assemblyProduct > > (AssemblyProductAttribute) > Attribute.GetCustomAttribute(currentAssembly, > typeof(AssemblyProductAttribute)); > > // Same process for the other attributes... > > Console.WriteLine(assemblyCompany.Company); > Console.WriteLine(assemblyProduct.Product); > } > } > } > //================================================= > > > Cordialement
Merci beaucoup.
Mais dans l'exemple, je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute. Comment puis-je faire si je ne connais pas les attributs à l'avance? Est-il possible de faire un cast dynamique du genre:
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un Assembly for(int i = 0; i < myAttributes.Length; i++) { (myAttributes[i]) attribute = (myAttributes[i]) Attribute.GetCustomAttribute(currentAssembly, myAttributes[i])); }
J'ai essayé quelque chose de similaire, mais cela ne marche pas car myAttributes[i] est de type object.
Julien
Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute" ?
C# est un langage typé statiquement, contrairement à la majorité des langages de scripts. -- Paul Bacelar
julien
Paul Bacelar wrote:
Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute" ?
C# est un langage typé statiquement, contrairement à la majorité des langages de scripts.
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou [assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à l'avance.
Merci julien
Paul Bacelar wrote:
Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais à
faire à un AssemblyCompanyAttribute" ?
C# est un langage typé statiquement, contrairement à la majorité des
langages de scripts.
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais
je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou
[assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à
l'avance.
Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais à faire à un AssemblyCompanyAttribute" ?
C# est un langage typé statiquement, contrairement à la majorité des langages de scripts.
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou [assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à l'avance.
Merci julien
Paul Bacelar
La seule chose que vous pouvez savoir sur un attribut, c'est qu'il dérive de "System.Attribute" et par la même, vous ne pouvez utiliser que les méthodes de cette classe.
Vous pouvez tout à fait créer votre propre classe d'attribut avec des méthodes qui vous voulez et tester si les attributs dérive de votre classe de base (MyCustomBaseAttribute dans l'exemple).
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un Assembly for(int i = 0; i < myAttributes.Length; i++)
MyCustomBaseAttribute myCustomBaseAttribute = attribute as MyCustomBaseAttribute;
if(myCustomBaseAttribute != null){
Console.WriteLine(attribute.MyCustomMéthode);
}
else
{
Console.WriteLine(attribute.ToString());
}
}
}
} }
Une approche plus modulaire dicterait l'utilisation d'une interface plutôt que d'une classe de base. -- Paul Bacelar
"julien" wrote in message news:4207f2df$0$538$
Paul Bacelar wrote: > Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais
à
> faire à un AssemblyCompanyAttribute" ? > > C# est un langage typé statiquement, contrairement à la majorité des > langages de scripts.
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou [assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à l'avance.
Merci julien
La seule chose que vous pouvez savoir sur un attribut, c'est qu'il dérive de
"System.Attribute" et par la même, vous ne pouvez utiliser que les méthodes
de cette classe.
Vous pouvez tout à fait créer votre propre classe d'attribut avec des
méthodes qui vous voulez et tester si les attributs dérive de votre classe
de base (MyCustomBaseAttribute dans l'exemple).
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un
Assembly
for(int i = 0; i < myAttributes.Length; i++)
MyCustomBaseAttribute myCustomBaseAttribute = attribute as
MyCustomBaseAttribute;
if(myCustomBaseAttribute != null){
Console.WriteLine(attribute.MyCustomMéthode);
}
else
{
Console.WriteLine(attribute.ToString());
}
}
}
}
}
Une approche plus modulaire dicterait l'utilisation d'une interface plutôt
que d'une classe de base.
--
Paul Bacelar
"julien" <julien@sobrier.net> wrote in message
news:4207f2df$0$538$636a15ce@news.free.fr...
Paul Bacelar wrote:
> Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais
à
> faire à un AssemblyCompanyAttribute" ?
>
> C# est un langage typé statiquement, contrairement à la majorité des
> langages de scripts.
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais
je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou
[assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à
l'avance.
La seule chose que vous pouvez savoir sur un attribut, c'est qu'il dérive de "System.Attribute" et par la même, vous ne pouvez utiliser que les méthodes de cette classe.
Vous pouvez tout à fait créer votre propre classe d'attribut avec des méthodes qui vous voulez et tester si les attributs dérive de votre classe de base (MyCustomBaseAttribute dans l'exemple).
Object[] myAttributes = asm.GetCustomAttributes(false); //asm est un Assembly for(int i = 0; i < myAttributes.Length; i++)
MyCustomBaseAttribute myCustomBaseAttribute = attribute as MyCustomBaseAttribute;
if(myCustomBaseAttribute != null){
Console.WriteLine(attribute.MyCustomMéthode);
}
else
{
Console.WriteLine(attribute.ToString());
}
}
}
} }
Une approche plus modulaire dicterait l'utilisation d'une interface plutôt que d'une classe de base. -- Paul Bacelar
"julien" wrote in message news:4207f2df$0$538$
Paul Bacelar wrote: > Où voulez-vous en venir avec "je dois connaître à l'avance que j'aurais
à
> faire à un AssemblyCompanyAttribute" ? > > C# est un langage typé statiquement, contrairement à la majorité des > langages de scripts.
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou [assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à l'avance.
Merci julien
Fabrice MALAINGRE
Bonjour Julien,
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou [assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à l'avance.
Dans ce cas il faut se tourner vers les méthodes de réflections pour découvrir dynamiquement le contenu de vos attributs.
Vous obtiendrez quelque chose du genre :
//================================================ using System; using System.Reflection;
foreach (Attribute currentAttribute in myAttributes) { Type attributeType = currentAttribute.GetType(); PropertyInfo[] attributeProperties = attributeType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo currentProperty in attributeProperties) { if (currentProperty.Name != "TypeId") { System.Console.WriteLine("[" + currentProperty.Name + "("" + currentProperty.GetValue(currentAttribute, null) + "")]"); System.Console.WriteLine(""); } } // foreach (PropertyInfo currentProperty in attributeProperties) } // foreach (Attribute currentAttribute in myAttributes) } // static void Main(string[] args) } // class Class1 } //================================================ Cependant, ce genre de mécanisme est à utiliser avec parcimonie, et ne se révèle pas toujours pertinent ! Tout dépend des contraintes de votre application.
Cordialement
____________________________ Fabrice MALAINGRE Architecte Logiciel - Chef de Projet THEORIS - www.theoris.fr
Bonjour Julien,
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je
pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou
[assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à
l'avance.
Dans ce cas il faut se tourner vers les méthodes de réflections pour
découvrir dynamiquement le contenu de vos attributs.
Vous obtiendrez quelque chose du genre :
//================================================ using System;
using System.Reflection;
foreach (Attribute currentAttribute in myAttributes)
{
Type attributeType = currentAttribute.GetType();
PropertyInfo[] attributeProperties =
attributeType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo currentProperty in
attributeProperties)
{
if (currentProperty.Name != "TypeId")
{
System.Console.WriteLine("[" + currentProperty.Name
+ "("" + currentProperty.GetValue(currentAttribute, null) + "")]");
System.Console.WriteLine("");
}
} // foreach (PropertyInfo currentProperty in
attributeProperties)
} // foreach (Attribute currentAttribute in myAttributes)
} // static void Main(string[] args)
} // class Class1
}
//================================================
Cependant, ce genre de mécanisme est à utiliser avec parcimonie, et ne se
révèle pas toujours pertinent ! Tout dépend des contraintes de votre
application.
Cordialement
____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Dans l'exemple, j'avais [assembly:AssemblyTitle("First plugin")]. Mais je pourrais avoir aussi [assembly:AssemblyMyAttribute("MyValue")] ou [assembly:AssemblyMyAttribute1("MyValue1")], je ne le saurais pas à l'avance.
Dans ce cas il faut se tourner vers les méthodes de réflections pour découvrir dynamiquement le contenu de vos attributs.
Vous obtiendrez quelque chose du genre :
//================================================ using System; using System.Reflection;
foreach (Attribute currentAttribute in myAttributes) { Type attributeType = currentAttribute.GetType(); PropertyInfo[] attributeProperties = attributeType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo currentProperty in attributeProperties) { if (currentProperty.Name != "TypeId") { System.Console.WriteLine("[" + currentProperty.Name + "("" + currentProperty.GetValue(currentAttribute, null) + "")]"); System.Console.WriteLine(""); } } // foreach (PropertyInfo currentProperty in attributeProperties) } // foreach (Attribute currentAttribute in myAttributes) } // static void Main(string[] args) } // class Class1 } //================================================ Cependant, ce genre de mécanisme est à utiliser avec parcimonie, et ne se révèle pas toujours pertinent ! Tout dépend des contraintes de votre application.
Cordialement
____________________________ Fabrice MALAINGRE Architecte Logiciel - Chef de Projet THEORIS - www.theoris.fr
julien
Paul Bacelar wrote:
La seule chose que vous pouvez savoir sur un attribut, c'est qu'il dérive de "System.Attribute" et par la même, vous ne pouvez utiliser que les méthodes de cette classe.
En fait, je croyais qu'on pouvait utiliser n'importe quel custom attribute [assembly:AssemblyMyAttribute("value")], mais il existe en fait une liste prédéfini de custom attribute (AssemblyAlgorithmId, AssemblyConfiguration, AssemblyCopyright, AssemblyCulture, AssemblyDefaultAlias, ...)
Merci Julien
Paul Bacelar wrote:
La seule chose que vous pouvez savoir sur un attribut, c'est qu'il dérive de
"System.Attribute" et par la même, vous ne pouvez utiliser que les méthodes
de cette classe.
En fait, je croyais qu'on pouvait utiliser n'importe quel custom
attribute [assembly:AssemblyMyAttribute("value")], mais il existe en
fait une liste prédéfini de custom attribute (AssemblyAlgorithmId,
AssemblyConfiguration, AssemblyCopyright, AssemblyCulture,
AssemblyDefaultAlias, ...)
La seule chose que vous pouvez savoir sur un attribut, c'est qu'il dérive de "System.Attribute" et par la même, vous ne pouvez utiliser que les méthodes de cette classe.
En fait, je croyais qu'on pouvait utiliser n'importe quel custom attribute [assembly:AssemblyMyAttribute("value")], mais il existe en fait une liste prédéfini de custom attribute (AssemblyAlgorithmId, AssemblyConfiguration, AssemblyCopyright, AssemblyCulture, AssemblyDefaultAlias, ...)