Par exemple:
class TestType
{
public int a;
public int b;
}
TestType obj = Activator.CreateInstance(typeof(TestType), 1, 2) as TestType;
Puis obj.a == 1 et obj.b == 2 code>? Quelqu'un sait-il comment résoudre mon problème?
3 Réponses :
Impossible, essayez à la place
TestType obj = Activator.CreateInstance(typeof(TestType)) as TestType; obj.a = 1; obj.b = 2;
TestType obj = Activator.CreateInstance(typeof(TestType), 1, 2) as TestType;
class TestType
{
public TestType(int a, int b)
{
this.a = a;
this.b = b;
}
public int a;
public int b;
}
Vous confondez les choses. La syntaxe new TestType {a = 1, b = 2} n'appelle pas le constructeur. C'est un raccourci pour appeler le constructeur implicite ou par défaut et définir certaines propriétés en une seule fois. Mais toutes les classes ont des constructeurs. Au moins l'implicite.
Je ne sais pas quel est votre objectif final, mais si vous utilisez Activator pour créer une instance, vous n'avez probablement pas le type au moment de la compilation . Ainsi, vous ne pouvez pas accéder aux propriétés via le type lui-même, vous devrez appeler PropertyInfo.SetValue ( https://docs.microsoft.com/en-us/dotnet/api/system.reflection.propertyinfo.setvalue ? view = netframework-4.7.2 )
Voir l'exemple suivant:
class TestType
{
public int a;
public int b;
}
void Main()
{
var typeName = typeof(TestType).FullName; // we have a string from here on
var type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.FullName == typeName); // get the type based on the name
var obj = Activator.CreateInstance(type); // object of this type, but without compile time type info
var member = type.GetField("a"); // we know, that this is a field, not a property
member.SetValue(obj, 1); // we set value to 1
member = type.GetField("b");
member.SetValue(obj, 2); // we set value to 2
Console.Write($"See values: a={((TestType)obj).a}, b={((TestType)obj).b}");
}
Dans cette dernière ligne de code, j'ai réintroduit la compilation- time type, juste pour montrer que l'objet construit a les membres définis comme nous nous attendons à ce qu'ils soient définis.
En général, vous rechercherez très probablement des types qui étendent un type de base ou implémentent une interface, mais il se peut que vous ayez le nom de type complet de la configuration par exemple.
Vous pouvez combiner la syntaxe du constructeur et la syntaxe d'initialisation d'objet, c'est donc l'abréviation de "construct object" et "assign members", ce qui signifie que vous pouvez faire ceci: new TestType (1) {b = 2} , à condition que le type ait un constructeur qui prend un seul paramètre.
@ LasseVågsætherKarlsen c'est vrai, mais cela pourrait être un scénario trop complexe pour OP basé sur la question ...
Pourquoi ne pouvez-vous pas attribuer les valeurs après avoir créé l'instance? comme obj.a = 1 et obj..b = 2
Pouvez-vous ajouter un constructeur ou des méthodes, ou s'agit-il d'une classe dans un assemblage tiers?
1) Le type a un constructeur, sauf s'il s'agit d'un type statique il aura au moins le constructeur par défaut fourni par le compilateur et 2) non, il n'y a pas d'appel de constructeur ou similaire dans le framework qui fera ce que vous voulez concernant les affectations, ce qu'Antoine répond ci-dessous est le plus proche que vous obtiendrez, sauf si vous ajoutez le constructeur manquant qui est.
parce que la classe TestType est juste une classe de données, n'a pas de méthode, j'ai beaucoup de classe de données. je ne veux pas créer de constructeur pour ces classes. et je dois les créer par réflexion