Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Μετατροπή Κώδικα VB.NET σε C#

Îåêßíçóå áðü ôï ìÝëïò imanos. Τελευταία δημοσίευση από το μέλος Markos στις 08-03-2018, 11:16. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-03-2018, 21:22 78243

    Μετατροπή Κώδικα VB.NET σε C#

        Public Shared Function DynamicGetFieldsInfo(AssemplyName As String, ObjectName As String) As Object
            Dim a As [Assembly] = [Assembly].Load(AssemplyName)
            Dim mytypes As Type() = a.GetTypes()
            Dim t As Type = a.GetType(AssemplyName & "." & ObjectName)
            Dim obj As [Object] = Activator.CreateInstance(t)
            Dim oFields As Object(,) = obj.GetFields(t)
            Return oFields
        End Function
     
     
    Υπάρχει ο παραπάνω κώδικας σε vb.net το ζητούμενο είναι να μπορέσω να πάρω το structure μίας κλάσης μαζί με τα Attributes . Στην vb δουλεύει μια χαρά.
    Θέλω να την μετατρέψω σε C#

    public static object DynamicGetFieldsInfo(string AssemplyName, string ObjectName)
    {
    Assembly a = Assembly.Load(AssemplyName);
    Type[] mytypes = a.GetTypes();
    Type t = a.GetType(ObjectName);
    Object obj = Activator.CreateInstance(t);
    object[,] oFields = obj.GetFields(t);  //  Το συγκεκριμμένο κομμάτι δεν παίζει σε C#
    return oFields;
     
    Μπορεί κάποιος να βοηθήσει ?

    Ιωάννης Μανουσάκης
  •  06-03-2018, 14:33 78244 σε απάντηση της 78243

    Απ: Μετατροπή Κώδικα VB.NET σε C#

    Καλησπέρα,

    Αυτό σε καλύπτει;

            static void Main(string[] args)
            {
                Assembly currentAssembly = Assembly.GetExecutingAssembly();
                Type[] assemblyTypes = currentAssembly.GetTypes();

                string typeName = "Foo";
                Type fooType = assemblyTypes.Where(t => t.Name.Equals(typeName)).FirstOrDefault();
                if (fooType != null)
                {
                    object obj = Activator.CreateInstance(fooType);

                    Console.WriteLine("Fields:");
                    FieldInfo[] objFields = obj.GetType().GetFields();
                    foreach (FieldInfo field in objFields)
                    {
                        Console.WriteLine($"- Field: {field.Name}, Type: {field.FieldType.Name}");
                    }

                    Console.WriteLine("Properties:");
                    PropertyInfo[] objProperties = obj.GetType().GetProperties();
                    foreach (PropertyInfo property in objProperties)
                    {
                        Console.WriteLine($"- Property: {property.Name}, Type: {property.PropertyType.Name}");
                    }

                    Console.WriteLine("Methods:");
                    MethodInfo[] objMethods = obj.GetType().GetMethods();
                    foreach (MethodInfo method in objMethods)
                    {
                        Console.WriteLine($"- Method: {method.Name}, Type: {method.ReturnType.Name}");
                    }


                }

            }
        }

        public class Foo
        {
            private int myVar1;
            private string myVar2;

            public int Field1 = 0;
            public string Field2 = string.Empty;

            public int MyProperty1
            {
                get { return myVar1; }
                set { myVar1 = value; }
            }

            public string MyProperty2
            {
                get { return myVar2; }
                set { myVar2 = value; }
            }

            public int fooMethod1(int a, int b)
            {
                return a + b;
            }
        }

     

    George J.

     

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-03-2018, 09:58 78245 σε απάντηση της 78244

    Απ: Μετατροπή Κώδικα VB.NET σε C#

    Ευχαριστώ για την άμεση απάντηση .

    Επειδή είχα φτιάξει και μία κλάση που κληρονομούσε την κλάση Attributes όπου μέσα σ' αυτή είχα φτιάξει μία method public void object[,] GetFields(Type t)  αλλά δεν την έκανα Serializable δεν έτρεχε ο κώδικας.

    Κατόπιν χρησιμοποίησα την MethodInfo για να τρέξω την GetFields(Type t) . Παρακάτω ο κώδικας που χρησιμοποίησα.

            public static Object DynamicGetFields(String AssemplyName, String ObjectName)

            {

                Assembly a = Assembly.Load(AssemplyName);
                Type t = a.GetType(ObjectName);
                object obj = Activator.CreateInstance(t);
                MethodInfo myMethod = obj.GetType().GetMethod("GetFields");
                object[] myParameters = new object[1];
                myParameters[0] = t;
                object[,] mFields = (object[,])myMethod.Invoke(obj, myParameters);
                return mFields;

            }

    Παρακάτω η της Μεθόδου GetFields από την κλάση που  κληρονομεί την Attributes

                public object[,] GetFields(Type t)

                {
                    PropertyInfo[] oFields = t.GetProperties();
                    PropertyInfo oField = default(PropertyInfo);
                    Attribute[] attributes = null;
                    object[,] StructureInfo = new object[oFields.Length, 2];

                    try

                    {
                       for (int i = 0; i <= oFields.Length - 1; i++)
                        {
                            oField = oFields[ι];
                            attributes = Attribute.GetCustomAttributes(oField, typeof(ColumnAttributes), false);
                            StructureInfo[i, 0] = oField;
                            StructureInfo[i, 1] = attributes;
                        }
                    }
                    catch (Exception e)
                    {
      DbHelper.DataHelper.ClsMisc.WriteLog((int)LogType.idError, "ColumnInfo GetFields Method", "DbHelper.DataHelper.DataColumnInfo", e.ToString(), AppDomain.CurrentDomain.BaseDirectory + "\\ErrorLog");
                    }

                    return StructureInfo;

                } 

    Ουσιαστικά ήθελα να πάρω την Structure της κλάσης που θέλω έχοντας σε ένα array δύο διαστάσεων το όνομα του property και τα Attributes που έχω δηλώσει σ' αυτό ,ώστε να μπορέσω να κάνω map με τα πεδία που υπάρχουν στο table  ενός dataset και να αποδώσω τις τιμές που μου επιστρέφονται από κάθε datarow στο αντίστοιχο Business object που έχω από την κλάση που θέλω .

     Γιώργο στο σημείο του κώδικα που έγραψες  FieldInfo[] objFields = obj.GetType().GetFields(); 
     Επειδή το είχα δοκιμάσει αν δεν δήλωνα μέσα στην GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic |  System.Reflection.BindingFlags.Public) δεν μου επέστρεφε τις FieldInfo[]. Μήπως ξέρεις γιατί?

    Πάντως και πάλι σ' ευχαριστώ για την άμεση απόκρισή σου. 


    Ιωάννης Μανουσάκης
  •  08-03-2018, 11:16 78246 σε απάντηση της 78245

    Απ: Μετατροπή Κώδικα VB.NET σε C#

    Το documentation αναφέρει ότι η GetFields() επιστρέφει μόνο public fields. Αν θες και τα υπόλοιπα, θα πρέπει να τα δηλώσεις χρησιμοποιώντας παραμέτρους. Ρίξε μια ματιά στα links:

    https://msdn.microsoft.com/en-us/library/system.type.getfields(v=vs.110).aspx

    https://msdn.microsoft.com/en-us/library/6ztex2dc(v=vs.110).aspx

     


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems