Δεν είναι δυνατή η πρόσβαση χρόνου εκτέλεσης Cache Χρήση Προβληματισμού

ψήφοι
1

Είμαι προσπαθεί να πάρει την ημερομηνία λήξης ενός HttpRuntime.Cacheαντικειμένου, σύμφωνα με αυτή την απάντηση:

https://stackoverflow.com/a/350374/1778169

Η μέθοδος είναι:

private DateTime GetCacheUtcExpiryDateTime(string cacheKey)
{
    object cacheEntry = Cache.GetType().GetMethod(Get, BindingFlags.Instance | BindingFlags.NonPublic).Invoke(Cache, new object[] { cacheKey, 1 });
    PropertyInfo utcExpiresProperty = cacheEntry.GetType().GetProperty(UtcExpires, BindingFlags.NonPublic | BindingFlags.Instance);
    DateTime utcExpiresValue = (DateTime)utcExpiresProperty.GetValue(cacheEntry, null);    
    return utcExpiresValue;
}

Όταν προσπαθείτε να χρησιμοποιήσετε την παραπάνω μέθοδο, η πρώτη γραμμή δεν θα συγκεντρώνουν:

Ένα αντικείμενο αναφοράς απαιτείται για object.GetType ()

Αν έχω αντικαταστήσει Cache.GetType()με HttpRuntime.Cache.GetType()αυτό συγκεντρώνει, αλλά έχω μηδενική επέστρεψα από αυτό το μέρος:

cacheType.GetMethod(Get, BindingFlags.Instance | BindingFlags.NonPublic).

Τι κάνω λάθος?

Είμαι χρησιμοποιώντας το .NET 4.5. System.Web.Caching είναι η έκδοση 4.0.0.0.

Δημοσιεύθηκε 07/11/2018 στις 23:50
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
2

Θα πρέπει να έχουν εξετάσει την αρχική πηγή, χρησιμοποιώντας το δικτυακό τόπο εγκατάστασης Microsoft για να μάθετε περισσότερες λεπτομέρειες σχετικά με την HttpRuntimeκατηγορία, ειδικά το Cacheακίνητο. Αν κοιτάξετε γραμμή 2794 της τάξης System.Web.HttpRuntime μπορείτε να δείτε τον ακόλουθο ορισμό του Cacheακινήτου:

 public static Cache Cache {
        get {
              ...
        }
 }

Τώρα, δεδομένου ότι το ακίνητο είναι staticδεν μπορείτε να χρησιμοποιήσετε τις δεσμευτικές σημαίες που χρησιμοποιείτε, δεδομένου ότι αυτή τη στιγμή ψάχνετε για ένα NonPublicμέλος που ανήκει σε ένα Instance. Σε .NET στατικές μεταβλητές δεν ανήκουν σε μια εμφάνιση, γι ο κωδικός που δημοσιεύτηκε θα έχει ως αποτέλεσμα μια εξαίρεση που ρίχνονται? απλά δεν μπορείτε να βρείτε το μέλος που ψάχνετε, δεδομένου ότι δεν υπάρχει στην περίπτωση που προβλέπεται - πλην όμως υπάρχει για τον ορισμό του τύπου της κατηγορίας που σας ενδιαφέρει να ( HttpRuntime).

Για να κάνετε την εργασία κωδικό σας θα πρέπει να παραλείψουμε τις δεσμευτικές σημαίες, τον εσωτερικό κωδικό .NET που χειρίζεται την αίτησή σας, θα καταλάβει τώρα προσπαθούμε για την αναζήτηση μια στατική μέθοδο: HttpRuntime.Cache.GetType().GetMethod("Get"). Σημείωση: αν θέλετε να έχετε bindingflags (αναγνωσιμότητα, understandabilty), θα μπορούσατε να προσθέσετε: BindingFlags.Public | BindingFlags.Static, η οποία κάνει ακριβώς το ίδιο όπως κάθε φορά που παραλείπουν τις σημαίες.

Αν θέλετε να εκτελέσει τη μέθοδο και να πάρει το αποτέλεσμα (να πάρει την πραγματική Cache) που μπορεί να επικαλεστεί το MethodDefinitionπου μόλις έλαβε από την GetMethodχρήση Invoke(null, null).

Απαντήθηκε 08/11/2018 στις 08:23
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more