2013-05-15 14 views
8

Nigdy nie widziałem tego błędu przed i jego bardzo mylące, jestem zasadniczo próbuje coś zrobić, gdzie mówię znajdź mi wszystkie lokalizacje (tylko zwrócić jeden), które pasują nazwą lokalizacja przekazany i typ:Metoda niestatyczna wymaga celu?

string name = columns[40]; 
Location type = db.Locations.Where(l => l.name == name).FirstOrDefault(); 
Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault(); 

Prawdopodobnie jest lepszy sposób na zrobienie tego, co chcę za jednym zamachem, ale w zasadzie otrzymuję nazwę z kolumny (pochodzi z pliku csv), a następnie powiedz: uzyskaj informacje o tej lokalizacji. Po tym mówię ok teraz, że mam cały ten jazz, idź mi miejsce z tym imieniem i jego typem.

Ale pojawia się błąd:

metoda Non-Static wymaga cel

metodę najwyższego poziomu cały ten kod jest uruchamiany w języku:

static void Main(string[] args){} 

zasadniczo jej tylko aplikacji konsoli. Więc co się dzieje?

  • db jest klasą kontekstową, powinno to być oczywiste.
  • kolumny jest mi ciągnięcie dane z pliku csv, w tym przypadku kolumn [40] byłoby coś jak „New York”

Pełny komunikat o błędzie ślad stosu: { "Non -statyczna metoda wymaga celu. "}

Uwaga: Pytanie zadane jako" możliwa odpowiedź "nie pomaga w tym przypadku, ponieważ główna metoda, w której uruchamiam ten kod, jest statyczna.

Po dalszych badaniach znalazłem nazwę i rodzaj były zerowy tak zrobiłem następującą poprawkę:

if (name != null) 
{ 
    Location type = db.Locations.Where(l => l.name == name).FirstOrDefault(); 
    Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault(); 
    locationNearbyId = loc.id; 

    // More code 
} 

Niestety wciąż pojawia się błąd na stronie: Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

+1

Gdzie * dokładnie * jest błąd? Co to jest "db"? Czym jest "kolumny"? –

+1

Czy możesz opublikować kompletny komunikat o błędzie? O której to nieistotnej metodzie chodzi? Na której linii? – sepp2k

+0

możliwy duplikat [metody niestatycznej wymaga docelowego C#] (http://stackoverflow.com/questions/4577191/non-static-method-requires-a-target-c-sharp) – jbabey

Odpowiedz

4

Okazuje się, że z powodu nazwa i typ może być null typ musi być ustawiona z boku if a więc muszę sprawdzić, czy typ i nazwa są nieważne przed continueing:

name = collumns[40]; 
type = db.Locations.Where(l => l.name == name).FirstOrDefault(); 

if (name != null && type != null) 
{ 
    Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault(); 

    //More code.... 
} 
+1

Wydaje się to bardzo mało prawdopodobne, ponieważ komunikat o błędzie, który podałeś brzmi, jakby to był naprawdę błąd kompilatora. Ale potem powiedziałeś, że traktujesz to jako wyjątek. Niestety, ponieważ twoje pytanie jest dość niejasne i niekompletne, trudno ci pomóc lub powiedzieć na pewno, czy ta odpowiedź jest rzeczywiście trafna, czy nie. –

+0

@JonSkeet Błąd jest bardzo mylący, gdy nie wiesz, co to oznacza. Otrzymałem ten błąd również przy użyciu zmiennej zwróconej z zapytania linq (moje zapytanie zwróciło jeden obiekt). Ten obiekt okazał się "zerowy". Kiedy już wiesz, że jest to obiekt zerowy, ma mnóstwo sensu. Wywołujesz metodę niestatyczną ("typ.type") bez celu (docelowy "typ" ma wartość null). To po prostu bardzo tajemniczy komunikat o błędzie. –

18

ja to się ze mną dzisiaj. Przyjdź, aby dowiedzieć się, że robię to:

Player player = db.Players 
    .Where(p => p.ClubID == course.Club.ID && p.IsActive == true && p.Phone != null) 
    .ToArray() 
    .SingleOrDefault(p => p.Phone.FormatPhoneNumber() == phone); 

gdzie course.Club był leniwy załadowane poprzez EF z mojej bazy danych. Na początku myślałem, że mój problem był przedłużeniem FormatPhoneNumber, ale potem okazało się, że usunięcie course.Club.ID naprawił problem:

int clubID = course.Club.ID; 
Player player = db.Players 
    .Where(p => p.ClubID == clubID && p.IsActive == true && p.Phone != null) 
    .ToArray() 
    .SingleOrDefault(p => p.Phone.FormatPhoneNumber() == phone); 

więc unikać wartości zaczerpniętych z leniwych załadowane obiektów w kolejnych zapytań LINQ - przypisać je do lokalnego zmienne, a następnie użyj tych zmiennych w zapytaniu.

+1

Niesamowite wytłumaczenie! Jest to popularna funkcja Linq getchya, która często zostaje zapomniana, z reguły zawsze oceniam właściwości lokalnych obiektów na zmienne lokalne, zanim użyję ich w zapytaniach Linq, ponieważ nigdy nie wiesz, kiedy ktoś inny ślepo będzie refaktoryzować twój kod lub zregenerować twoje klasy danych. Włączono leniwy ładowanie. –

0

Faktem jest, że problem wynika z zerowego obiektu "type". Rozwiązałbym ten sposób:

var tType = type?.type; 
Location loc = db.Locations.Where(l => l.name == name && (type != null && l.type == tType)).FirstOrDefault(); 
Powiązane problemy