Jak przekonwerterować string na istniejacy obiekt

0

Jak moge przekonwerterowac string na istniejacy obiekt w c#? Chodzi mi o to ze zamiast podawac jako argument funkcji obiekt danej klasy, chcialbym podac tylko stringa ktory przechowuje nazwe obiektu. Jak moge to zrobic? Ponizej przykladowy kod:

namespace Project
{
    public class MyClass
    {
       
    }

    public static class AnotherClass
    {
        public static string myString = "myObject";
        public static void DoSomething(MyClass myObject)
        {
            // Ta funkcja bierze jako argument obiekt klasy "MyClass"
            // Chcialbym zeby to dzialalo w nastepujacy sposob:
            DoSomething(SomeFunction(myString));

            // czyli zamiast podawac bezposrednio obiekt (ktory jest juz stworzony gdzies w kodzie), chcialbym podac zmienna string
            // ktorej wartosc jest taka sama jak nazwa obiektu.
        }
    }


}
5

Nie da się takiego czegoś zrobić. A nawet gdyby się dało jakimś cudem to na pewno oprócz jakiś ekstremalnie rzadkich zastosowań byłoby odradzane. Jaki problem próbujesz rozwiązać? Na pewno jest jakieś prostsze rozwiązanie. Może hash mapa Dictionary<string, MyClass> byłaby ok?

0

@ple: nie chce tworzyc nowego obiektu wiec to nie rozwiazuje mojego problemu.

@maszrum: w moim kodzie w pewnym momencie pobierane sa dane z pewnej bazy. To co chcialbym zrobic to pozwolic uzytkownikowi zmienic te dane wlasnie poprzez wprowadzenie nowego parametru do metody w sposob jaki opisalem

1

@Tuptuś Tupta: moglbys opisac co chcesz osiagnac? na zasadzie co chcesz rozwiazac tym sposobem

a odnosnie tego sposobu to mam pare pytan

  • jaka wartosc bedzie w stringu?
  • Skad wiesz jakie properties bedzie trzeba uzupelnic a jakie nie?
  • Jaka przewaga jest tego rozwiazania?
  • Dlaczego nie nadpisac wartosc w Twoim obiekcie?
0

@fasadin: Pomysl jest taki: Mam funkcje, ktora w swoim ciele tworzy duzo obiektow (powiedzmy 10 obiektow ktorych "nazwy" to "obiekt1", "obiekt2", ... "obiekt10"). Wartosci tych obiektow pobierane sa z bazy danych, wiec kazdy obiekt ma sporo Properties. Chcialbym aby ta funkcja jako dodatkowy argument brala dictionary, gdzie keys to np. "obiekt1_property2" a values to np. "Nowa wartosc dla property2 w obiekcie obiekt1". Czyli uzytkownik tej funkcji wie ze pobiera ona z bazy danych pewne obiekty, i chcialby aby wartosci pewnych propeirties byly nadpisane wewnatrz funkcji. Wiem ze moge do tego celu uzyc czegos w stylu:

var propertyToSet = myObject.GetType().GetProperty(myPropertyName);
propertyToSet.SetValue(myObject, value, null);

Ale wtedy dla kazdego obiektu musialbym cos takiego napisac. Wolalbym to zrobic poprzez wprowadzenie tego dodatkowego dictionary, czyli najpierw rozbilbym sobie klucz na obiekt i property (uzywajac Split("_"), i pozniej jakos ustawil nowa wartosc dla tego property w tym obiekcie. Czyli idealnie byloby gdyby udalo sie zamienic string "obiekt1" na istniejacy obiekt o tej samej nazwie. Czyli powyzszy kod dla kazdego obiektu nadpisalbym jakim pojedynczym kodem w stylu:

var propertyToSet = ConvertStringToObject("myObject").GetType().GetProperty(myPropertyName);
propertyToSet.SetValue(ConvertStringToObject("myObject"), value, null);
0

moje pytanie jest co chcesz tym pomyslem rozwiazac? Dlaczego potrzebujesz ten pomysl?

0

Pierwsze rozwiązanie to interfejs:

public interface IMyInterface
    {
        
    }
    public class MyClass1 : IMyInterface
    {

    }
    public class MyClass2 : IMyInterface
    {

    }
    public class AnotherClass
    {
        public AnotherClass()
        {
            MyClass1 myClass1 = new MyClass1();
            MyClass2 myClass2 = new MyClass2();
            DoSomething(myClass1);
            DoSomething(myClass2);
        }
        public void DoSomething(IMyInterface myInterface)
        {
            // ?
        }
    }

Drugie rozwiązanie:

public class myClass
    {

    }
    public class AnotherClass<T>
    {
        public T myObject { get; private set; }
    }

    public AnotherClass<myClass> anotherClass;
3

@Tuptuś Tupta:

Tuptuś Tupta napisał(a):

Pomysl jest taki: Mam funkcje, ktora w swoim ciele tworzy duzo obiektow (powiedzmy 10 obiektow ktorych "nazwy" to "obiekt1", "obiekt2", ... "obiekt10"). Wartosci tych obiektow pobierane sa z bazy danych, wiec kazdy obiekt ma sporo Properties. Chcialbym aby ta funkcja jako dodatkowy argument brala dictionary, gdzie keys to np. "obiekt1_property2" a values to np. "Nowa wartosc dla property2 w obiekcie obiekt1". Czyli uzytkownik tej funkcji wie ze pobiera ona z bazy danych pewne obiekty, i chcialby aby wartosci pewnych propeirties byly nadpisane wewnatrz funkcji. Wiem ze moge do tego celu uzyc czegos w stylu:myObject"), value, null);

Z każdym krokiem brniesz w coś dziwnego. Do złego designu, złych struktur danych, złego wybrania sposobu (i celu), betonujesz zła implementacją.

W sensie ogólnym: istnieje w informatyce takie coś, jak zrzucanie całego żywego obiektu do np stringu (ogólnie do postaci zdolnej do zapisu w pliku) i jego odtwarzania. Nazywa się to serialzacja / serialisation / deserializacja, ale jest niemal pewne, że nie o to chodzi

0

dotnet add package Newtonsoft.Json --version 13.0.1

string json = @"{
  'Name': 'Bad Boys',
  'ReleaseDate': '1995-4-7T00:00:00',
  'Genres': [
    'Action',
    'Comedy'
  ]
}";

var m = JsonConvert.DeserializeObject<Movie>(json);

string name = m.Name;
// Bad Boys

1 użytkowników online, w tym zalogowanych: 0, gości: 1